当前位置: 首页 > 知识库问答 >
问题:

在非域帐户上使用带有服务帐户凭据的Google API

蓟俊杰
2023-03-14

我正在构建一个需要读取普通Gmail收件箱(不是域的一部分)的Web服务。

代码:

String serviceAccountEmail = "1234567890@developer.gserviceaccount.com";

var certificate = new X509Certificate2(@"key.p12", "notasecret", X509KeyStorageFlags.Exportable);

ServiceAccountCredential credentials = new ServiceAccountCredential(
    new ServiceAccountCredential.Initializer(serviceAccountEmail)
    {
        Scopes = new string[] { GmailService.Scope.GmailModify },
        User = "user@gmail.com"
    }.FromCertificate(certificate));

var service = new GmailService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credentials,
    ApplicationName = ApplicationName,
});

UsersResource.MessagesResource.ListRequest allMessages = service.Users.Messages.List("me");

IList<Message> messages = allMessages.Execute().Messages;

错误:

An unhandled exception of type 'Google.Apis.Auth.OAuth2.Responses.TokenResponseException' occurred in Google.Apis.dll

Additional information: Error:"unauthorized_client", Description:"Unauthorized client or scope in request.", Uri:""

我看不出这有什么原因不起作用,但读完这篇文章后,你似乎不能在个人@gmail帐户上使用服务帐户凭据。有谁知道这是真的还是我做错了什么?

感谢您的帮助!

更新

如果我将Scope更改为GmailService。范围。GmailReadonly,我可以查看邮件,但无法修改标签,这是我的要求。

共有1个答案

孟鹤龄
2023-03-14

服务号是一个虚拟用户,可能有它的gmail帐户,但我怀疑它(我也从未测试过它)对于一个服务号能够访问你的数据,它必须获得访问它的权限。

就像其他用户一样,服务帐户无法访问您的电子邮件,因为据我所知,无法授予其他人或服务帐户访问用户电子邮件的权限。

让我们以谷歌日历为例。如果我授予服务帐户电子邮件地址访问我帐户上的日历,它将能够从中读取。如果我允许它访问我的谷歌驱动器上的文件夹,它也可以从中读取。基本上,您可以像其他用户一样添加服务帐户电子邮件,如果您可以这样做,那么服务帐户就可以访问数据。

这在Blogger和YouTube上也不起作用,因为你不能“添加电子邮件地址以允许其他用户访问你的帐户”。据我所知,没有办法授权其他人或电子邮件访问您的gmail。您需要使用OAUTH2并对用户进行身份验证。

 类似资料:
  • 为了访问GMail API(并将呼叫拟人化),我使用了一个服务帐户(从谷歌云平台创建)。我的json文件看起来像这样 我还使用oAuth2client库使其更容易,但我找不到创建凭据然后指定范围和委托帐户的方法。 我试过了 但是我得到了一个错误,因为它需要一个PKCS-8密钥。 我该怎么做?(如果有帮助,我的代码在应用程序引擎 Flex 上运行) 谢啦

  • 因此,我正在尝试在我的本地主机上获取服务应用程序凭据,并且遇到了一些问题。我创建并下载了json密钥,我想保护它们,而不是让它们变成纯文本。 我想知道最好的方法。我有这个代码: 这里的问题是我的JSON文件在我的存储库中以纯文本形式公开。

  • 我有一个使用OAuth客户端从GDrive文件导出文本的脚本,它运行得非常好- 但是每次都要通过OAuth流是一件痛苦的事情,因为只有我在使用这个脚本,所以我想简化一些事情,使用一个服务帐户来代替它,从这篇文章开始- Google Drive API Python服务帐户示例 我的新服务帐户脚本执行完全相同的操作,如下所示- 但是当我为同一个运行它时,我会得到以下结果- 感觉服务帐户脚本正在通过身

  • 我正在创建一个帐户链接Alexa技能。我得到了链接授权码并将其交换为访问令牌。然后,我尝试将所有参数:代码、访问令牌、技能ID放入Alexa技能激活API。我总是得到一个信息:“无效的帐户链接凭据”。 要怎么做?

  • 我正在尝试在 Go 应用引擎部署上使用具有域范围委派 (DwD) 的服务帐户。 我已按照使用 Google 应用程序默认凭据的步骤将服务帐户与应用引擎配合使用。 我让代码在我的开发计算机上本地运行,但我被困在从我的域中检索实际数据。 我用的是Admin SDK。在“向您的服务帐户授予域范围的权限”一节中,它说我的“服务帐户需要模拟其中一个用户来访问Admin SDK Directory API”。

  • 我必须下载/上传/删除文件从一个文件夹驱动器与Node.js服务器。该文件夹位于公司的谷歌办公套件内,公司中只有少数人可以访问。 我必须使用一个服务帐户来做这件事,问题是:这可能吗?我该怎么做? 我已经读过了https://developers.google.com/drive/v2/web/delegation和https://developers.google.com/identity/pro