【问题标题】:Use Google Service Account with google API JavaScript Client将 Google 服务帐户与 google API JavaScript 客户端一起使用
【发布时间】:2020-06-09 10:31:46
【问题描述】:

我想知道是否可以使用服务帐户从任何 google API 请求数据但使用此库:https://github.com/google/google-api-javascript-client

我设法从谷歌云控制台了解如何使用带有 OAuth2.0 凭据的库。 但我真正需要的是使用服务帐号来获取这些数据。

这是我用来从 OAuth2.0 凭据中获取数据的代码:

initClient() {
      return gapi.client.init({
        apiKey: this.GSC_API_KEY, // already defined in the application
        client_id:
          "xxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
        scope:
          "https://www.googleapis.com/auth/webmasters https://www.googleapis.com/auth/webmasters.readonly",
        discoveryDocs: [
          "https://www.googleapis.com/discovery/v1/apis/webmasters/v3/rest"
        ]
      });
    },

   gapiList() {
      this.initClient()
        .then(() => {
          // Executes an API request, and returns a Promise.
          // The method name `webmasters.sites.list` comes from the API webmasters.
          return gapi.client.webmasters.sites.list();
        })
        .then(
          response => {
            console.log(response.body);
          },
          err => {
            console.error(err.details);
          }
        );
    },

以下是请求 API 的代码:

gapi.load("client", this.gapiList);

它确实返回了很好的数据。

但我的最终目的需要我使用服务帐户。

initClient 函数确实需要一个 client_id 才能正确加载。如果我提供服务帐户的 client_id,它确实会返回一个错误。

"Not a valid origin for the client: http://localhost:8080/ has not been whitelisted for client ID xxxxxxxxxxxxx. Please go to https://console.developers.google.com/ and whitelist this origin for your project's client ID.

错误消息告诉我将 localhost(我目前正在工作的地方)列入白名单,但我没有找到如何将服务帐户的 localhost 列入白名单。

希望我提供了足够的信息。

感谢您的回复和帮助。

【问题讨论】:

    标签: javascript api google-api google-oauth service-accounts


    【解决方案1】:

    正如消息所示,您需要允许 localhost:8080 作为 origin 来调用 API。为了保护您和您的用户,Google 将您的 OAuth 2.0 应用程序限制为使用授权域。如果您已通过 Google 验证了该域,则可以将任何顶级私有域用作授权域。

    添加授权域后,您可以使用其任何子域或页面,以及任何其他关联的国家/地区代码。在添加重定向或原始 URI、主页 URL、服务条款 URL 或隐私政策 URL 之前添加您的授权域。

    要完成此操作,请按照these 步骤操作:

    1. 在 GCP Console 中,点击 API 和服务,然后点击 OAuth 同意屏幕。您可能需要先点击菜单菜单。
    2. 在应用程序名称字段中,输入 G Suite Migrate 并点击保存。
    3. 在左侧菜单中,单击凭据。
    4. 点击创建凭据,然后点击 OAuth 客户端 ID。
    5. 选择 Web 应用程序。
    6. 在名称字段中,输入 OAuth Web 客户端的名称。
    7. 在授权的 JavaScript 来源字段中,输入您将用于访问 G Suite Migrate 平台的网址(例如, http://localhost:5131)。
    8. 点击创建。
    9. 记下客户端 ID 字段中显示的客户端 ID。您在设置 G Suite Migrate 平台时会用到它。提示:您可以 还可以从 API 和服务访问客户端 ID,然后访问凭据。
    10. 点击确定。

    注意:授权过程可能需要一些时间 完成。

    额外:如果您希望服务帐户能够代表用户调用 API,您还需要将域范围的权限委派给服务帐户。这个有详细解释here

    【讨论】:

    • 感谢您对@Nebulastic 的完整回答,但是由于服务帐户没有“授权的 JavaScript 来源字段”,这对服务帐户有何作用?非常感谢您的帮助!
    • 嗨@LIMJacky,我相应地更新了答案。您需要将域范围的权限委派给您的服务帐户。这样,服务帐户将能够代表您调用 API。
    • 嗨@Nebulastic,感谢您的快速回复。我确实委派了域范围的权限并启用了所需的每个 API,但结果是相同的,我仍然收到此错误:不是客户端的有效来源:localhost:8080 没有被列入客户端 ID xxxxxxxxxxxxx 的白名单。请转到console.developers.google.com 并为您的项目客户将此来源列入白名单。有没有想过这个问题?
    • 您是否同时进行了委托和白名单/授权 localhost:8080 来源?
    • 我做了委托,但是如何白/授权 localhost:8080 来源,因为服务帐户没有此部分?我在什么地方错过了吗?
    【解决方案2】:

    您不能将服务帐户与 Google JavaScript 客户端库一起使用。

    您应该使用 Oauth2 身份验证。如果您必须使用服务帐户,则需要使用服务器端语言,例如 node.js 或 python 等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-10
      • 2014-10-15
      • 2017-02-11
      • 2012-10-12
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      相关资源
      最近更新 更多