如何调试身份验证配置?

时间:2018-12-05 07:41:12

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

我们在域范围内委派服务帐户身份验证时遇到问题。 主要问题是很难调查和调试auth配置,因此 我们想问一些技巧,如何调试配置。 或者也许我们缺少一些配置选项,您可以将其指向。

我们的过程是:

  1. 创建具有启用的域范围内委派的SA(=服务帐户)。
  2. 在GSuite管理控制台(https://support.google.com/a/answer/162106?hl=en)中对SA进行身份验证。
    • 使用凭据文件中的client_id。 (现在为电子邮件)
    • 范围用逗号分隔,之间没有空格。
  3. 确保选中“安全> API参考> API参考->'启用API访问'”。

对于某些GSuite域,这是有效的配置,但是我们得到了一些域,该配置导致:

  

google.auth.exceptions.RefreshError :(“'unauthorized_client:未经授权的客户端可以使用此方法检索访问令牌。','{\ n“ error”:“ unauthorized_client”,\ n“ error_description”:“客户端未经授权使用此方法检索访问令牌。“ \ n}')

根据我们的理解,这是错误的,原因是未将client_id和范围添加到“管理API客户端访问”页面。 (=经过身份验证的客户端列表)

我们确实确保了我们所请求的GSuite域具有正确的client_id,并且已在经过身份验证的客户端列表中添加了范围,并且具有“已启用的API访问权限”。 我们甚至与他们一起创建了Shared Desktop,并由我们自己进行了完全确定。 但是错误仍然存​​在。

但是,我们无法在我们的测试GSuite域上复制此问题。 我们使用与客户端相同的SA尝试了几种选择:

  1. 模拟帐户没有访问资源的权限。 结果是:
  

googleapiclient.errors.HttpError:https://www.googleapis.com/admin/directory/v1/users?customer=my_customer&alt=json返回了“未授权访问此资源/ api“>

  1. 作用域只是部分的:
  

google.auth.exceptions.RefreshError :(“ access_denied:请求的客户端未经授权。”,“ {\ n“ error”:“ access_denied”,\ n“ error_description”:“请求的客户端未经授权。“ \ n} ')

  1. 未选中“启用的API访问权限”。
  

googleapiclient.errors.HttpError:https://www.googleapis.com/admin/directory/v1/users?customer=my_customer&alt=json返回“域无法使用api。“>

  1. 我们从客户端收到的错误(“未经授权,客户端无法使用此方法检索访问令牌。”),仅当client_id根本不在经过身份验证的客户端列表中时,我们才能复制。 但是我们可以确定,有问题的GSuite域在“管理API客户端访问”页面上对SA进行了身份验证。

我们正在使用以下范围:https://www.googleapis.com/auth/userinfo.profile,https://www.googleapis.com/auth/userinfo.email,https://www.googleapis.com/auth/gmail.readonly,https://www.googleapis.com/auth/plus.login,https://www.googleapis.com/auth/calendar.readonly,https://www.googleapis.com/auth/contacts.readonly, https://www.googleapis.com/auth/admin.directory.user.readonly

您对如何调试/解决此问题有任何想法吗?

2 个答案:

答案 0 :(得分:1)

这是您需要做的。仔细检查每个步骤。如有疑问,请重新开始。

  1. 启用“ Admin SDK API。将在每个项目中启用。
  2. 创建一个服务帐户。不要添加或删除任何特权。请勿以任何方式更改服务帐户。如果这样做,您会得到一个错误,表明您未经授权。
  3. 在服务帐户上启用域范围委派。
  4. 按照此文档将域范围的权限委派给您的服务帐户:

Delegate domain-wide authority to your service account

  1. (从下载的Json中)创建服务帐户凭据时,您将需要以下范围进行完整的G Suite管理:

    https://www.googleapis.com/auth/admin.directory.group”, “ https://www.googleapis.com/auth/admin.directory.user

  2. 模拟创建新凭据的用户帐户。该用户帐户必须是G Suite超级管理员。此帐户必须至少登录一次G Suite,并且接受服务条款

  3. 使用第5步中的凭据创建客户端。

有效的Python示例:

from googleapiclient.discovery import build
from google.oauth2 import service_account

# This is the service account credentials file
credentials_file = 'google-directory-api.json'

# In this example I only need to send email
credentials = service_account.Credentials.from_service_account_file(
                credentials_file,
                scopes=['https://www.googleapis.com/auth/gmail.send'])

# This user is a G Suite superadmin
impersonate = 'username@example.com'

credentials = credentials.with_subject(impersonate)

service = build('gmail', 'v1', credentials=credentials)

答案 1 :(得分:0)

我认为我们将需要分阶段进行。让我们从您的第一个错误开始,看看是否可以解决您的问题。

背景信息

您可以在Google开发者控制台中创建几种类型的客户端。这是前三名。

  • 浏览器客户端:用于Web应用程序
  • 本地客户端(其他):用于已安装的桌面应用程序
  • 服务帐户:用于服务器到服务器的通信。

客户端不同,您下载的client.json文件也不同,并且用于认证服务器的代码也不同。

错误1:代码/客户端不匹配

  

unauthorized_client:未经授权,客户端可以使用此方法检索访问令牌。

可以表示两件事之一。您已经创建了服务帐户客户端,但没有使用服务帐户代码进行身份验证,或者正在使用代码对服务帐户进行身份验证,但是尚未创建服务帐户客户端。您尚未发布您使用的语言或任何代码,因此我无法告诉您您使用的代码是否打算与服务帐户一起使用。您将不得不仔细研究这一点。

在开发人员控制台中签入,请确保您的客户端像这样,如果是,请检查您的代码。如果不是,请创建一个真实的服务帐户客户端,然后重试。

enter image description here