Google Directory API:使用服务帐户检索用户信息时出现 403

Posted

技术标签:

【中文标题】Google Directory API:使用服务帐户检索用户信息时出现 403【英文标题】:Google Directory API: 403 when retrieving user information with service account 【发布时间】:2018-03-16 03:33:54 【问题描述】:

这可能与Google Directory API returns 403 for user_list with showDeleted=true 有关,但很遗憾我还无法发表评论,也无法提供答案。

我收到了来自学校 G Suite 的 service account 并获得了许可

https://www.googleapis.com/auth/admin.directory.user.readonly

G Suite 管理员表示他已将域范围的权限委派给该帐户,并且我能够创建服务帐户 JWT 并检索访问令牌以使用 HTTP/REST 流调用 API。但是,当我致电user get endpoint 请求有关帐户的信息时-

https://www.googleapis.com/admin/directory/v1/users/redacted%40redacted.com?projection=full

我收到以下信息:

The remote server returned an error: (403) Forbidden.

  "error": 
    "errors": [
      
        "domain": "global",
        "reason": "forbidden",
        "message": "Not Authorized to access this resource/api"
      
    ],
    "code": 403,
    "message": "Not Authorized to access this resource/api"
  

我无权访问他们的 G Suite 管理面板,因此无法在自己周围闲逛,但管理员已确认我们的客户在他能找到的任何地方都可以访问 admin.directory.user.readonly 权限,如上所述,我们处于具有域范围访问权限的角色。我愿意接受有关管理员可能缺少分配权限的地方的建议,或者我的方法中可能缺少的任何内容(尽管 JWT 构建/签名和访问令牌检索似乎按预期工作)。如果我可以提供任何其他有用的信息,请告诉我,我会更新。

更新:帐户的权限似乎是正确的——我能够从用户那里检索信息/在 API Explorer 中获取信息。但是,API Explorer 使用的是 URL

https://www.googleapis.com/admin/directory/v1/users/redacted%40redacted.com?projection=full&key=YOUR_API_KEY

而且我在服务帐户或用户/获取文档中都找不到任何关于 key 参数的文档。我将 access_token 作为不记名令牌包含在规范中定义的身份验证标头中,当我尝试将其作为密钥查询字符串参数发送时,我仍然收到上面记录的相同 403 错误。 Stack (Google API Client users().get(userKey='name@domain.com') returns Not Authorized to access this resource/api) 上有一个类似的问题没有答案。

【问题讨论】:

【参考方案1】:

没有玩过 Admin SDK,但我建议检查 Perform G Suite Domain-Wide Delegation of Authority,因为它侧重于服务帐户的使用。

将域范围的权限委派给您的服务帐户

您创建的服务帐户需要被授予访问 您要访问的 G Suite 域的用户数据。下列 任务必须由 G Suite 域的管理员执行:

    转到您 G Suite 域的管理控制台。 从控件列表中选择安全。如果您没有看到列出的安全性,请从底部的灰色栏中选择更多控件 ,然后从控件列表中选择安全性。 从选项列表中选择高级设置。 在身份验证部分选择管理 API 客户端访问。 在“客户名称”字段中输入服务帐户的客户 ID。 在一个或多个 API 范围字段中,输入应授予您的应用程序访问权限的范围列表(见下图)。为了 例如,如果您需要对用户和组进行域范围的访问,请输入: https://www.googleapis.com/auth/admin.directory.user, https://www.googleapis.com/auth/admin.directory.group 点击授权按钮。

您的服务帐号现在可以在域范围内访问 Google 管理员 适用于您域中所有用户的 SDK 目录 API。你准备好了 代表实例化授权的 Admin SDK 目录服务对象 您的 G Suite 域的用户。

【讨论】:

【参考方案2】:

您需要从谷歌控制台启用 API 访问

Dictionary API

Enable API

【讨论】:

感谢您的建议。管理员提供的屏幕截图显示这些设置已启用。您对我们可以尝试的后续步骤有什么建议吗?

以上是关于Google Directory API:使用服务帐户检索用户信息时出现 403的主要内容,如果未能解决你的问题,请参考以下文章

Google_Service_Directory - (403) 无权访问此资源/api

无法使用 Google Directory API Admin SDK 列出用户

使用 Google Directory API 未找到组织单元

周末 Google Directory API 发生了啥变化/中断?

是否可以仅使用字符串中的 api 键从 Directory API 获取用户列表?

允许在没有Active Directory信任的情况下进行winhttp委派