【问题标题】:Why my API calls using google-api-nodejs-client to Google Analytics are not working in production?为什么我使用 google-api-nodejs-client 对 Google Analytics 的 API 调用在生产环境中不起作用?
【发布时间】:2019-05-25 19:13:11
【问题描述】:

我使用google-api-nodejs-client 调用Google Analytics Reporting API 以显示博客内的访问次数。

此博客托管在 Google App Engine 标准环境中。

在开发中,我正在使用Application Default Credentials 验证我的 API 调用。我从专门为分析目的创建的帐户服务下载了带有凭据的 JSON 文件,将文件设置为 Google_Application_Credentials 环境变量,一切正常。我能够从 Google Analytics 获取数据并将其显示在网站上。

但这在生产中不起作用。我想getClient() 在那个环境中没有获得凭据。

注意事项:1)我没有使用服务帐户的凭据上传下载的 JSON 文件(我认为这样做会违反直觉且不安全,根据我在文档中的理解,GCP 能够自动处理 API 身份验证);


const {google} = require("googleapis");

async function main () {

    // This method looks for the GCLOUD_PROJECT and GOOGLE_APPLICATION_CREDENTIALS
    // environment variables.
    const auth = await google.auth.getClient({
        // Scope of the analytics reporting,
        // with only reading access.
        scopes: 'https://www.googleapis.com/auth/analytics.readonly',
    });

    // Create the analytics reporting object
    const analyticsreporting = await google.analyticsreporting({
        version: 'v4',
        auth: auth,
    });

    // Fetch the analytics reporting
    const res = await analyticsreporting.reports.batchGet({...});
    return res.data;
}

我已经没有办法了。有人可以帮我解决这个问题吗?

【问题讨论】:

  • Google_Application_Credentials 全部大写。 App Engine 身份:cloud.google.com/docs/authentication/…
  • @JohnHanley,这不是问题所在。正如我所说,一切都在开发环境中运行良好。问题出在生产环境中,由 Google Cloud 自动配置和处理。
  • 我想知道缺少什么部分。我已经完成了在文档中找到的所有内容。我唯一没有做的是使用API App Engine App Identity,因为他们还没有发布任何与 Node.js 相关的内容。
  • 我有一个疑问。我是否需要将包含我的服务帐户密钥的 JSON 文件上传到生产环境并将其设置为 GOOGLE_APPLICATION_CREDENTIALS 以在生产环境中验证我的 API 调用?还是仅在开发中需要?
  • 您可以选择使用 App Engine 的默认服务帐户进行身份验证,或者通过 Json 凭据文件手动指定服务帐户(您在开发中所做的方式)。

标签: node.js google-analytics google-cloud-platform google-analytics-firebase google-api-nodejs-client


【解决方案1】:

这是默认范围和应用程序默认凭据的问题。默认情况下,如果您不创建新的服务帐户,您将从 GCE 元数据服务获取“应用程序默认凭据”: https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-nodejs

这些凭据通常只有cloud-platform 范围,并且不能更改范围集(截至今天)。要完成这项工作,您有几个选择。

  1. 您可以创建一个新的服务帐户,下载服务帐户密钥,然后使用getClient 方法选项中的keyFile 属性来引用该密钥。如果您这样做,您传递给getClient 的范围将受到尊重。

  2. 您可以使用运行 GAE 应用程序的服务帐户可用的范围。我没有亲自尝试过,但理论上应该是可能的。

祝你好运!

【讨论】:

  • 嗨@justin-beckwith,感谢您的帮助。 :) 我已经创建了一个服务帐户,下载了服务帐户凭据并配置了一个环境变量来隐式获取凭据,所以我不需要在getClient 中设置keyfile 变量。但是我正面临着那个老故事,在开发中它可以工作,但是当我将代码发送到生产环境时,它就不行了。困扰我的一件事是我没有在生产环境中配置相同的环境变量,在 GCP 中,这就是为什么我认为它不起作用,但文档中没有说我需要这样做。
  • 如果配置了我的环境变量,getClient 方法能够隐式获取凭据:cloud.google.com/docs/authentication/…
  • 我是否应该将analytics.readonly 范围替换为cloud-platform.read-only
  • > 困扰我的一件事是我没有在生产中配置相同的环境变量,您仍然需要设置它!您可以在生产环境中设置该环境变量,也可以将路径传递给getClient
  • 是的,上传 JSON 凭证文件并在 getClient 中设置它的路径不起作用。但无论如何这是不安全的,不推荐,因为我暴露了我自己的服务帐户凭据。应该发生的是 Google Analytics API 调用由 Google Cloud 自动进行身份验证。
猜你喜欢
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2015-06-24
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
相关资源
最近更新 更多