我刚刚开始使用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,这样可以让我完全访问所有资源,但没有任何乐趣。
我想我只是错过了一个简单的步骤,但我不确定下一步该在哪里看。
答案 0 :(得分:1)
<强> TL; DR 强>
我会仔细阅读,但这是短版本。我知道这是一篇较老的帖子,但希望它能找到你!
如果您未在Google管理控制台中更新/白名单列出服务帐户的权限/范围,则需要执行此操作,确保域已启用API访问权限,请确保已设置服务帐户正确地,当创建&#34;证书&#34;对象请注意其参数,以便正确实例化,检查被模拟帐户的权限,最后确保您已创建适当的Google Apps服务帐户密钥(可能很容易使密钥类型不合适。)< / p>
在管理控制台中列出Google API
这使Google Apps服务帐户能够使用您在Google Apps域中提供的任何范围。
现在,某些API范围必须为所需的服务帐户列入白名单。在“客户端名称”文本框中,提供服务帐户的客户端ID。客户端ID在开发人员控制台中获取。在“一个或多个API范围”中添加所需的范围;逗号分隔。
请注意,如果有现有的范围,则会将其删除,因此请务必重新添加所需的范围。
启用域范围API访问
创建适当的Google Apps服务帐户密钥(可能是这个)
我发现如果密钥不是以这种方式创建的,那么它就可以打开制作API密钥或OAuth 2.0客户端/用户密钥的可能性。这些是在这种情况下使用的错误类型的密钥,您需要创建服务帐户密钥。上述方法强制您创建服务帐户密钥。
修改现有的Google Apps服务帐户的设置
我没有讨论如何设置实际的服务帐户,在您的情况下,您可能需要做的一件事是确保服务帐户启用了域范围委派。这是在Google Developer Console中切换的。应该很容易找到。
<强>代码强>
您没有提供用于创建令牌的完整代码库,因此只想添加一些您可能无法正常执行的操作。
确保在创建证书时,您提供的密码是默认的&#34; notasecret&#34;串。此秘密目前是由Google分发的所有密钥提供的默认值,并且在密钥创建期间是不可变的。我有一个证明这一点的链接,但后来失去了它。
X509Certificate2 certificate = new X509Certificate2(certificateFilePath, "notasecret", X509KeyStorageFlags.Exportable);
只是想提倡正确的编码。虽然我在过去发现了一些错误,谷歌的常量值需要额外的字符串操作(添加额外的斜杠)。你应该使用它们提供的字符串常量来代替文字。我只是说要使用这些,因为它提供了一层抽象,也就是说谷歌永远不会改变文字;不可能的。
在您的情况下,新范围是:
GmailService.Scope.GmailModify
旧范围是:
GmailService.Scope.GmailReadonly
否则,代码明智的一切对我来说都很好。
要尝试的另一件事是确保服务帐户模拟的实际Google Apps用户帐户具有足够的权限。如果是这种情况,我会怀疑是一个不同的错误,而不是在响应中获得403。无论如何,在你的情况下,这是&#34; abc@test.domain.com"帐户。再次,您将转到Google管理控制台,检查其角色,确保检查是否有足够的角色,无论您尝试做什么。我不知道在这种情况下您需要具体的内容,最好的办法是给予它与&#34;超级管理员相同的权限。角色然后删除权限,看看它可能实际需要什么。否则,如果可能的话,只需给它&#34;超级管理员。&#34;
如果我是赌徒,我会把钱存在一个不恰当创建的服务帐户密钥上。我刚刚遇到这个问题,这是唯一产生了你所接受的同样错误的错误。其他的东西会让我一样#34;描述&#34;响应令牌中的值,但不相同&#34;错误&#34;值。我甚至不确定罪魁祸首是如何制作的,因为我没有成功。我只知道解决方法是使用上述步骤重新创建一个新密钥,并修复了问题。