【问题标题】:C# GMAIL API Service Account Modify - unauthorized_clientC# GMAIL API 服务帐户修改 - 未授权客户端
【发布时间】:2016-06-21 19:34:54
【问题描述】:

我刚开始使用 c# Google.Apis.Gmail.V1 类并使用服务帐户读取邮箱。

当我使用以下 sn-p 时,我的代码工作正常

 ServiceAccountCredential credential = new ServiceAccountCredential(
           new ServiceAccountCredential.Initializer(ServiceAccountEmailAddress)
           {
               User = "abc@test.domain.com",
               Scopes = new[] { "https://www.googleapis.com/auth/gmail.readonly" }
           }.FromCertificate(certificate));

使用该代码我可以成功调用以下代码

if (credential.RequestAccessTokenAsync(CancellationToken.None).Result)
        {
}

但我需要修改电子邮件,所以我将范围从

https://www.googleapis.com/auth/gmail.readonly

https://www.googleapis.com/auth/gmail.modify

我现在在请求访问令牌时遇到异常

{"错误:\"unauthorized_client\",描述:\"请求中未经授权的客户端或范围。\",Uri:\"\""}

我在 Google Developers Console 中检查了服务帐户 (*.iam.gserviceaccount.com),并尝试了所有权限选项,包括 OWNER,这应该让我可以完全访问所有资源,但没有乐趣。

我想我只是错过了一个简单的步骤,但我不确定下一步该往哪里看。

【问题讨论】:

    标签: c# email gmail-api google-api-dotnet-client service-accounts


    【解决方案1】:

    TL;DR

    我会通读这个,但这里是简短的版本。我知道这是一篇较旧的帖子,但希望它能找到你!

    如果您尚未在 Google 管理控制台中更新/将服务帐户的权限/范围列入白名单,则需要执行此操作,确保域启用了 API 访问权限,并确保在创建时正确设置了服务帐户“证书”对象要知道它的参数,以便正确实例化它,检查被模拟帐户的权限,最后确保您已经制作了适当的 Google Apps 服务帐户密钥(很容易制作不适当的密钥类型。 )

    在管理控制台中将 Google API 列入白名单

    这使 Google Apps 服务帐户能够使用您在 Google Apps 域中提供的任何范围。

    1. 使用以下链接登录到 Google Apps 管理控制台。 https://admin.google.com/
      • Google Apps 用户帐户必须具有足够的权限才能修改域相关设置。它不必是用于在开发者控制台中创建 Google Apps 项目的帐户。如果该帐户没有权限,您将被定向到一个完全不同的屏幕,没有选项可以单击不同的域控制 Web 应用程序,如“安全”、“角色”、“支持”、“组”等。相反,您将转储到显示“Gmail”、“Drive”、“Docs”等典型用户应用程序的页面上。它把你带到的当前链接是https://apps.google.com/user/hub
    2. 点击“安全”。
    3. 点击安全选项列表底部的“显示更多”选项。
    4. 点击“高级设置”获取更多选项。
    5. 选择“管理 API 客户端访问”链接。
    6. 现在,某些 API 范围必须为所需的服务帐号列入白名单。在“客户名称”文本框中提供服务帐户的客户 ID。客户端 ID 在开发者控制台中获取。在“一个或多个 API 范围”中添加所需的范围;逗号分隔。

      请注意,如果存在现有范围,它们将被删除,因此请务必重新添加任何需要的范围。

    启用域范围的 API 访问

    1. 使用以下链接登录到 Google Apps 管理控制台。 https://admin.google.com/
    2. 转到“安全”页面。
    3. 在“API 参考”部分下
    4. 确保“启用 API 访问”已启用。

    创建适当的 Google Apps 服务帐户密钥(可能是这样)

    1. 转到 Google 开发者控制台。以创建 Google Apps 项目/服务帐户的 Google Apps 用户身份登录。 https://console.developers.google.com/
    2. 导航到您创建服务帐户的特定项目。
    3. 点击项目页面左侧的“服务帐户”按钮,打开一个包含项目所有服务帐户的页面。
    4. 单击所需服务帐户行右侧的垂直椭圆小部件。选择“创建密钥”。
    5. 选择 .p12 键,因为它看起来就是您要使用的。点击“创建”。请务必保护好此密钥。

    我发现如果密钥不是以这种方式创建的,那么它就可以创建 API 密钥或 OAuth 2.0 客户端/用户密钥。这些是在这种情况下使用的错误类型的密钥,您需要创建一个服务帐户密钥。上述方式强制您创建服务帐号密钥。

    修改现有 Google Apps 服务帐户的设置

    我不会讨论如何设置实际的服务帐户,您可能需要做的一件事是确保服务帐户启用了域范围的委派。这是在 Google Developer Console 中切换的。应该很容易找到。

    代码

    您没有提供用于创建令牌的整个代码库,因此只想添加一些您可能做的不正确的事情。

    1. 确保在创建证书时提供的密钥是默认的“notasecret”字符串。此密钥目前是由 Google 分发的所有密钥提供的默认值,并且在密钥创建期间是不可变的。我有一个链接可以证明这一点,但后来丢失了。

      X509Certificate2 certificate = new X509Certificate2(certificateFilePath, "notasecret", X509KeyStorageFlags.Exportable);
      
    2. 只是试图提倡正确的编码。虽然我在过去发现了一些需要额外字符串操作(添加额外斜杠)的 Google 常量值的错误。但您确实应该使用它们提供的字符串常量来代替文字。我只说使用这些,因为它提供了一个抽象层,也就是说谷歌永远不会改变文字;不太可能。

    在您的情况下,新范围是:

    GmailService.Scope.GmailModify
    

    虽然旧范围是:

    GmailService.Scope.GmailReadonly
    

    否则,我认为所有代码方面的内容都不错。


    要尝试的另一件事是确保服务帐户所模拟的实际 Google Apps 用户帐户具有足够的权限。如果是这种情况,我会怀疑另一个错误,而是在响应中得到 403。无论如何,在您的情况下,这是“abc@test.domain.com”帐户。您将再次转到 Google 管理控制台,检查其角色,确保它有足够的角色检查您要执行的任何操作。我不知道在这种情况下你具体需要什么,最好的办法是给它与“超级管理员”角色相同的权限,然后在你去查看它可能实际需要什么时删除权限。否则,如果可能的话,只需给它“超级管理员”。


    如果我是一个赌徒,我会把钱花在一个创建不当的服务帐户密钥上。我最近遇到了这个问题,这是唯一产生与您收到的完全相同的错误的东西。其他事情会让我在响应令牌中获得相同的“描述”值,但不是相同的“错误”值。我什至不确定罪魁祸首是如何制作的,因为我没有成功。我只知道解决方法是使用上述步骤重新创建一个新密钥并解决问题。

    【讨论】:

      猜你喜欢
      • 2017-02-22
      • 1970-01-01
      • 2020-01-06
      • 2013-08-21
      • 2014-09-13
      • 2013-06-18
      • 2014-11-18
      • 2018-07-07
      • 1970-01-01
      相关资源
      最近更新 更多