C#GMAIL API服务帐户修改 - unauthorized_client

时间:2016-03-08 01:50:13

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

我刚刚开始使用c#Google.Apis.Gmail.V1课程并使用服务帐户来阅读邮箱。

当我使用以下代码段

时,我的代码工作正常
 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:\&# 34; \""}

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

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

1 个答案:

答案 0 :(得分:1)

<强> TL; DR

我会仔细阅读,但这是短版本。我知道这是一篇较老的帖子,但希望它能找到你!

如果您未在Google管理控制台中更新/白名单列出服务帐户的权限/范围,则需要执行此操作,确保域已启用API访问权限,请确保已设置服务帐户正确地,当创建&#34;证书&#34;对象请注意其参数,以便正确实例化,检查被模拟帐户的权限,最后确保您已创建适当的Google Apps服务帐户密钥(可能很容易使密钥类型不合适。)< / p>

在管理控制台中列出Google API

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

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

    请注意,如果有现有的范围,则会将其删除,因此请务必重新添加所需的范围。

  7. 启用域范围API访问

    1. 使用以下链接登录Google Apps管理控制台。 https://admin.google.com/
    2. 转到“安全”页面。
    3. 在“API参考”部分
    4. 确保已启用“启用API访问”。
    5. 创建适当的Google Apps服务帐户密钥(可能是这个)

      1. 转到Google Developer Console。以创建Google Apps项目/服务帐户的Google Apps用户身份登录。 https://console.developers.google.com/
      2. 导航到您创建服务帐户的特定项目。
      3. 点击&#34;服务帐户&#34;项目页面左侧的按钮,显示包含所有项目服务帐户的页面。
      4. 单击所需服务帐户行右侧的垂直椭圆小部件。选择“创建密钥”。
      5. 选择.p12键,因为它看起来像是您尝试使用的内容。点击&#34;创建。&#34;请务必保护此密钥。
      6. 我发现如果密钥不是以这种方式创建的,那么它就可以打开制作API密钥或OAuth 2.0客户端/用户密钥的可能性。这些是在这种情况下使用的错误类型的密钥,您需要创建服务帐户密钥。上述方法强制您创建服务帐户密钥。

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

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

        <强>代码

        您没有提供用于创建令牌的完整代码库,因此只想添加一些您可能无法正常执行的操作。

        1. 确保在创建证书时,您提供的密码是默认的&#34; notasecret&#34;串。此秘密目前是由Google分发的所有密钥提供的默认值,并且在密钥创建期间是不可变的。我有一个证明这一点的链接,但后来失去了它。

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

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

          GmailService.Scope.GmailModify
          

          旧范围是:

          GmailService.Scope.GmailReadonly
          

          否则,代码明智的一切对我来说都很好。

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

          如果我是赌徒,我会把钱存在一个不恰当创建的服务帐户密钥上。我刚刚遇到这个问题,这是唯一产生了你所接受的同样错误的错误。其他的东西会让我一样#34;描述&#34;响应令牌中的值,但不相同&#34;错误&#34;值。我甚至不确定罪魁祸首是如何制作的,因为我没有成功。我只知道解决方法是使用上述步骤重新创建一个新密钥,并修复了问题。