是否可以使用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错误表明没有人试过这个。
有可能吗?
答案 0 :(得分:1)
所以谷歌似乎忘了在他们的文档中包含这个小细节:
AssertionFlowClient provider = new AssertionFlowClient(server, certificate)
{
ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
Scope = "https://mail.google.com/",
ServiceAccountUser = "user@mydomain.com", // <- important
};
似乎请求访问多个范围(空格分隔)失败。