Cloud Functions 中的间歇性身份验证错误

Posted

技术标签:

【中文标题】Cloud Functions 中的间歇性身份验证错误【英文标题】:Intermittent authentication errors in Cloud Functions 【发布时间】:2018-02-05 23:55:46 【问题描述】:

我有一个简单的云函数,它接收一个 webhook,然后将流式插入 BigQuery。代码基于这个sample(除了我使用的是流式插入)

exports.webHook = function webHook (req, res) 
  return Promise.resolve()
    .then(() => 
      if (req.method !== 'POST') 
        const error = new Error('Only POST requests are accepted');
        error.code = 405;
        throw error;
      

      const events = req.body || ;
      if (events) 
        const opts =  ignoreUnknownValues: true ;
        bigquery
          .dataset('config.DATASET')
          .table('config.TABLE')
          .insert(events, opts)
          .then((data) => 
            console.log(`Success: $JSON.stringify(data[0])`);
          )
          .catch((error) => 
            if (error.name === 'PartialFailureError') 
              console.error(`PARTIAL ERROR: $JSON.stringify(error)`);
               else 
              console.error(`OTHER ERROR: $JSON.stringify(error)`);
            

          );
      ;
    )
    .then(() => res.status(200).end())
    .catch((err) => 
      console.error(err);
      res.status(err.code || 500).send(err);
      return Promise.reject(err);
    );
;

此功能在大多数情况下运行良好,但我确实偶尔会遇到身份验证错误,然后就消失了。

textPayload: "其他错误: "code":401,"errors":["message":"Request 具有无效的身份验证凭据。预期的 OAuth 2 访问令牌, 登录 cookie 或其他有效的身份验证凭据。看 https://developers.google.com/identity/sign-in/web/devconsole-project.","domain":"global","re​​ason":"unauthorized"],"message":"请求 具有无效的身份验证凭据。预期的 OAuth 2 访问令牌, 登录 cookie 或其他有效的身份验证凭据。看 https://developers.google.com/identity/sign-in/web/devconsole-project.""

我不确定身份验证如何成为问题,因为 Cloud Function 和 BigQuery 都在同一个项目中。

【问题讨论】:

我强烈建议在Public Issue Tracker 上报告该问题。 您多久收到一次此错误?可能是您的令牌即将过期。 @Sonya - 问题来来去去都是随机的,我无法指出任何具体的问题。由于云功能和 BigQuery 等其他服务都在单个 GCP 项目中运行,因此应该处理身份验证。 与***.com/questions/45222507/…重复或类似 【参考方案1】:

Cloud Functions 团队的人员认为这可能是由于访问令牌的生存时间 (TTL) 存在问题,并建议了一个对我有用的解决方法。不要在代码顶部初始化 BigQuery(正如他们所有的示例都有),而是将初始化代码放在进行调用的函数中。

这样做:

exports.webHook = function webHook (req, res) 
  const bigquery = require('@google-cloud/bigquery')();
  return Promise.resolve()
    .then(() => 
      if (req.method !== 'POST') 
        const error = new Error('Only POST requests are accepted');
        error.code = 405;
        throw error;
      
      .
      .

代替:

const bigquery = require('@google-cloud/bigquery')();
.
.
exports.webHook = function webHook (req, res) 
      return Promise.resolve()
        .then(() => 
          if (req.method !== 'POST') 
            const error = new Error('Only POST requests are accepted');
            error.code = 405;
            throw error;
          
          .
          .

【讨论】:

以上是关于Cloud Functions 中的间歇性身份验证错误的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Cloud Functions shell:添加身份验证令牌以调用可调用对象

Google Cloud Functions Deploy“允许未经身份验证的调用......”

当应用使用电话验证进行身份验证时,使用 Google Cloud Functions 发送欢迎电子邮件

如何在 Google Cloud Functions 的 python 环境中检查 HTTP 基本身份验证

如何在 Firestore Cloud Functions 上使用 Apollo Server GraphQL 在 TypeScript 中处理身份验证

如何在 Cloud Functions 存储触发器中获取经过身份验证的 Firebase 用户的 uid