1

是否可以使用 AssertionFlowClient 和服务帐户通过 IMAP 访问我域中任何用户的邮箱。与 2-legged 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 客户端访问” 在 cpanel 上配置为“电子邮件(读/写/发送) https://mail.google.com/ ”。

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

有可能吗?

4

1 回答 1

1

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

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

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

于 2013-04-06T13:42:43.260 回答