使用AssertionFlowClient和服务帐户访问Gmail的IMAP

时间:2013-04-05 20:44:03

标签: .net oauth-2.0 gmail-imap google-api-dotnet-client

是否可以使用AssertionFlowClient和服务帐户通过IMAP访问我域中任何用户的邮箱。与2脚OAuth 1.0相同。

这是我的代码:

X509Certificate2 certificate =  new X509Certificate2(...)
AuthorizationServerDescription server = new AuthorizationServerDescription {...};
List<string> scope = new List<string> { 
    "https://mail.google.com/", 
    "https://www.googleapis.com/auth/userinfo#email" };

AssertionFlowClient provider = new AssertionFlowClient(server, certificate)
{
  ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
  Scope = string.Join(" ",scope.ToArray()),
};

IAuthorizationState grantedAccess = AssertionFlowClient.GetState(provider);
accessToken = grantedAccess.AccessToken;

using (Imap client = new Imap())
{
    client.ConnectSSL("imap.gmail.com");
    client.LoginOAUTH2("user@mydomain.com", accessToken);
    ...
}

我可以从accounts.google.com服务器检索有效的accessToken(虽然AssertionFlowClient / DotNetOpenAuth有一个错误,目前我使用调试器和监视窗口来检索它)。

我确定accessToken是正确的,因为我可以使用它查询www.googleapis.com/userinfo/email API端点 - 它返回与SERVICE_ACCOUNT_EMAIL相同的值。

Gmail的IMAP服务器会返回以下错误

{"status":"400","schemes":"Bearer","scope":"https://mail.google.com/"}

此服务帐户的“管理API客户端访问”配置为“在电子邮件上发送电子邮件(读/写/发送)https://mail.google.com/”。

AssertionFlowClient / DotNetOpenAuth错误表明没有人试过这个。

有可能吗?

1 个答案:

答案 0 :(得分:1)

所以谷歌似乎忘了在他们的文档中包含这个小细节:

AssertionFlowClient provider = new AssertionFlowClient(server, certificate)
    {
        ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
        Scope = "https://mail.google.com/",
        ServiceAccountUser = "user@mydomain.com",  // <- important
    };

似乎请求访问多个范围(空格分隔)失败。