node.js - 谷歌云发布订阅 : Previously valid subscription suddenly unauthorized

标签 node.js oauth google-cloud-platform google-cloud-pubsub

我在使用 Google Cloud PubSub API 时遇到了一些问题。最近,我开始使用 Cloud PubSub 为我正在使用的聊天服务器排队消息。来自 PubSub 订阅的消息被转发给使用 socket.io Node 库的用户。我可以轻松设置此设置 - 我运行我的 node.js 服务器,打开几个浏览器窗口,我可以毫无问题地聊天。

但是,我注意到,通常在服务器运行几个小时后,它开始吐出以下错误:

(node:2525) UnhandledPromiseRejectionWarning:未处理的 promise 拒绝(拒绝 ID:1):错误:请求具有无效的身份验证凭据。预期的 OAuth 2 访问 token 、登录 cookie 或其他有效的身份验证凭据。请参阅 https://developers.google.com/identity/sign-in/web/devconsole-project。 ( Node :2525)UnhandledPromiseRejectionWarning:未处理的 promise 拒绝(拒绝 ID:2):错误:请求具有无效的身份验证凭据。预期的 OAuth 2 访问 token 、登录 cookie 或其他有效的身份验证凭据。请参阅 https://developers.google.com/identity/sign-in/web/devconsole-project。

...

(node:2525) UnhandledPromiseRejectionWarning:未处理的 promise 拒绝(拒绝 ID:1253):错误:请求具有无效的身份验证凭据。预期的 OAuth 2 访问 token 、登录 cookie 或其他有效的身份验证凭据...

此错误不断重复(您可以在错误消息中看到递增的 rejection id),直到几分钟后停止,一切恢复正常。当我收到错误消息时,我无法通过 Cloud PubSub 发送任何消息。

这是设置监听器的代码:

function listenForMessages(handler)
{
    var pubsub = require('@google-cloud/pubsub')({
        projectId: config.pubsub_project_id,
        keyFilename: config.pubsub_keyfile
    });

    pubsub.subscribe(config.pubsub_topic, 'test-subscription', {autoAck: true}, function(err, subscription){
        subscription.on('message', function(message) {
            handler(message.data);
        });
    });
}

凭据来自外部配置文件 - 我很确定它们没问题,特别是考虑到在我最初运行服务器时设置监听器没有问题。

TL;DR:在我开始运行使用 Google Cloud PubSub 对消息进行排队的 Node 服务器几个小时后,我开始反复收到“无效凭据”错误。

最佳答案

我遇到了同样的问题,终于找到了解决办法。问题是谷歌 token 过期,因此 pubsub 订阅者抛出异常。对于类似的 oauth 问题,github 中已经存在一个错误。 ( Link )

此问题已在 node-pubsub 中修复版本 0.20.0 并升级到此版本将解决您的问题。实际修复在 google-auth-library-nodejs version 2.0 node-pubsub:v0.20.0 使用 google-auth-library-nodejs:2.0

来自 google-auth-library-nodejs:2.0 的 github 发行说明:

The OAuth2.refreshAccessToken method has been deprecated. The getAccessToken, getRequestMetadata, and request methods will all refresh the token if needed automatically. There is no need to ever manually refresh the token.

希望对您有所帮助!!

关于node.js - 谷歌云发布订阅 : Previously valid subscription suddenly unauthorized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45222507/

相关文章:

node.js - 如何从 Node js发送json数据到html页面

javascript - 查询两个临近日期且 Firestore 不起作用

c# - 获取 OAuth 回调 [C#]

google-cloud-platform - 将 Google Cloud Run 服务连接到 Google Cloud SQL 数据库

javascript - Socket.io 在使用命名空间时不发出/接收事件

node.js - 使用 node js express 实现 IMS LTI

.net - 用于 Web 表单的 Google.Apis.Auth.OAuth

oauth - Gmail IMAP,为X个最新事件的Gmail线程搜索最佳方法

php - GAE gcloud dev_appserver.py PHP : Failed to read session data: user (path: Memcache)

google-cloud-platform - 连接 GCP 上的两个云运行服务