TL;DR
我会通读这个,但这里是简短的版本。我知道这是一篇较旧的帖子,但希望它能找到你!
如果您尚未在 Google 管理控制台中更新/将服务帐户的权限/范围列入白名单,则需要执行此操作,确保域启用了 API 访问权限,并确保在创建时正确设置了服务帐户“证书”对象要知道它的参数,以便正确实例化它,检查被模拟帐户的权限,最后确保您已经制作了适当的 Google Apps 服务帐户密钥(很容易制作不适当的密钥类型。 )
在管理控制台中将 Google API 列入白名单
这使 Google Apps 服务帐户能够使用您在 Google Apps 域中提供的任何范围。
- 使用以下链接登录到 Google Apps 管理控制台。
https://admin.google.com/
- Google Apps 用户帐户必须具有足够的权限才能修改域相关设置。它不必是用于在开发者控制台中创建 Google Apps 项目的帐户。如果该帐户没有权限,您将被定向到一个完全不同的屏幕,没有选项可以单击不同的域控制 Web 应用程序,如“安全”、“角色”、“支持”、“组”等。相反,您将转储到显示“Gmail”、“Drive”、“Docs”等典型用户应用程序的页面上。它把你带到的当前链接是https://apps.google.com/user/hub
- 点击“安全”。
- 点击安全选项列表底部的“显示更多”选项。
- 点击“高级设置”获取更多选项。
- 选择“管理 API 客户端访问”链接。
-
现在,某些 API 范围必须为所需的服务帐号列入白名单。在“客户名称”文本框中提供服务帐户的客户 ID。客户端 ID 在开发者控制台中获取。在“一个或多个 API 范围”中添加所需的范围;逗号分隔。
请注意,如果存在现有范围,它们将被删除,因此请务必重新添加任何需要的范围。
启用域范围的 API 访问
- 使用以下链接登录到 Google Apps 管理控制台。
https://admin.google.com/
- 转到“安全”页面。
- 在“API 参考”部分下
- 确保“启用 API 访问”已启用。
创建适当的 Google Apps 服务帐户密钥(可能是这样)
- 转到 Google 开发者控制台。以创建 Google Apps 项目/服务帐户的 Google Apps 用户身份登录。 https://console.developers.google.com/
- 导航到您创建服务帐户的特定项目。
- 点击项目页面左侧的“服务帐户”按钮,打开一个包含项目所有服务帐户的页面。
- 单击所需服务帐户行右侧的垂直椭圆小部件。选择“创建密钥”。
- 选择 .p12 键,因为它看起来就是您要使用的。点击“创建”。请务必保护好此密钥。
我发现如果密钥不是以这种方式创建的,那么它就可以创建 API 密钥或 OAuth 2.0 客户端/用户密钥。这些是在这种情况下使用的错误类型的密钥,您需要创建一个服务帐户密钥。上述方式强制您创建服务帐号密钥。
修改现有 Google Apps 服务帐户的设置
我不会讨论如何设置实际的服务帐户,您可能需要做的一件事是确保服务帐户启用了域范围的委派。这是在 Google Developer Console 中切换的。应该很容易找到。
代码
您没有提供用于创建令牌的整个代码库,因此只想添加一些您可能做的不正确的事情。
-
确保在创建证书时提供的密钥是默认的“notasecret”字符串。此密钥目前是由 Google 分发的所有密钥提供的默认值,并且在密钥创建期间是不可变的。我有一个链接可以证明这一点,但后来丢失了。
X509Certificate2 certificate = new X509Certificate2(certificateFilePath, "notasecret", X509KeyStorageFlags.Exportable);
只是试图提倡正确的编码。虽然我在过去发现了一些需要额外字符串操作(添加额外斜杠)的 Google 常量值的错误。但您确实应该使用它们提供的字符串常量来代替文字。我只说使用这些,因为它提供了一个抽象层,也就是说谷歌永远不会改变文字;不太可能。
在您的情况下,新范围是:
GmailService.Scope.GmailModify
虽然旧范围是:
GmailService.Scope.GmailReadonly
否则,我认为所有代码方面的内容都不错。
要尝试的另一件事是确保服务帐户所模拟的实际 Google Apps 用户帐户具有足够的权限。如果是这种情况,我会怀疑另一个错误,而是在响应中得到 403。无论如何,在您的情况下,这是“abc@test.domain.com”帐户。您将再次转到 Google 管理控制台,检查其角色,确保它有足够的角色检查您要执行的任何操作。我不知道在这种情况下你具体需要什么,最好的办法是给它与“超级管理员”角色相同的权限,然后在你去查看它可能实际需要什么时删除权限。否则,如果可能的话,只需给它“超级管理员”。
如果我是一个赌徒,我会把钱花在一个创建不当的服务帐户密钥上。我最近遇到了这个问题,这是唯一产生与您收到的完全相同的错误的东西。其他事情会让我在响应令牌中获得相同的“描述”值,但不是相同的“错误”值。我什至不确定罪魁祸首是如何制作的,因为我没有成功。我只知道解决方法是使用上述步骤重新创建一个新密钥并解决问题。