我有一个C#安装的应用程序,通过IMAP访问Gmail。使用传统的IMAP身份验证,它适用于单个Gmail用户和Google Apps用户。
我现在已经使用Google的.Net API添加了对OAuth 2.0身份验证的支持。这适用于常规Gmail帐户(例如someone@gmail.com),但对于具有不同域的Google Apps帐户却失败。提示用户通过Web浏览器登录并接受访问,但随后IMAP身份验证尝试失败,并显示“凭据无效”。对于Google Apps域,是否需要采取不同的措施?
正如我在下面的评论中首次报道的那样,我在这方面取得了一个小小的突破。最初我使用文字字符串“user”为用户参数调用GoogleWebAuthorizationBroker.AuthorizeAsync()(因为这是我在许多示例中看到的)。这适用于普通的Gmail用户,但我发现,对于Google Apps,必须传递授权用户的实际电子邮件地址。
有一段时间我认为这是问题的整体解决方案。事实证明并非如此。麻烦的是,它现在可以在内部测试中完美运行,但在我们拥有的一个测试版网站上,通常会以同样的方式失败。我只能想到失败的4个可能原因:(1)程序获得了无效的访问令牌,(2)它以某种方式破坏了该令牌,(3)它正在错误地进行XOAUTH身份验证或(4)它是使用令牌验证令牌不适用的帐户。我认为谷歌不太可能提供无效令牌,所以(1)可以在很大程度上打折。 (2)和(3)总是可行的,但代码适用于我们自己的几个Gmail和Google Apps帐户的事实使它们看起来不太可能。客户坚持认为(4)并非如此。所以我仍然感到困惑。
有人建议我尽早发布一些代码,现在我已经准备好了。以下是执行身份验证的C#函数的开头:
private void AuthenticateXOAuth2(string strUsername, string strAccessToken)
{
uint uStatus = 0;
// The SASL XOAUTH2 initial client response has the following format:
//
// base64("user=" {User} "^Aauth=Bearer " {Access Token} "^A^A")
string strInitialClientResponse = "user=" + strUsername + "\x1" + "auth=Bearer " + strAccessToken + "\x1\x1";
byte[] vbInitialClientResponse = Encoding.UTF8.GetBytes(strInitialClientResponse);
string strBase64InitialClientResponse = System.Convert.ToBase64String(vbInitialClientResponse);
string strCommand = "AUTHENTICATE XOAUTH2 " + strBase64InitialClientResponse;
SendCommand(strCommand);
...
我仍然在努力解决这个问题,盲目的小巷变得更加沮丧。我必须纠正我之前说过的一件事:我断言该程序在内部测试中适用于Google Apps域。这是一种幻觉;它实际上从来没有。
有人告诉我,我需要使用服务帐户来覆盖域用户。这似乎令我感到困惑,因为我的程序在任何意义上都不是服务器,但我尝试过。它没有像我尝试的那样工作 - 但我不能确定我做得对。有一些使用服务帐户的确认或否定是正确的策略会有很大帮助。
答案 0 :(得分:0)
如果没有看到您的代码,我唯一的预感就是您没有发送初始客户响应的完整电子邮件地址:
https://developers.google.com/gmail/xoauth2_protocol#the_sasl_xoauth2_mechanism
除此之外,显示您的代码可能有助于我们查看问题。
答案 1 :(得分:0)
您可能需要检查您的域帐户中是否已激活IMAP / POP;在我工作的公司,他们出于安全原因限制了这种访问,以下是你应该如何启用它:
在Gmail设置中启用IMAP
登录Gmail。 单击右上角的齿轮。 选择设置。 单击“转发”和“POP / IMAP”。 选择“启用IMAP”。 单击“保存更改”。
参考:https://support.google.com/mail/troubleshooter/1668960?hl=en#ts=1665018