0

我已经完成了为我的 Google 帐户(不使用 GSuite)上的测试应用程序创建 OAuth2 访问令牌的过程,每当我尝试使用它通过 imap.google.com 使用 XOAUTH2 进行身份验证时,它都会失败并返回 {" status":"400","schemes":"Bearer","scope":"https://mail.google.com/"} 后跟 IMAP 状态响应 NO [AUTHENTICATIONFAILED] 凭据无效(失败)

我已经看到其他一些类似的问题,事实证明问题是因为他们在请求令牌时没有使用范围https://mail.google.com/ 。但是,我确实使用了该范围并且令牌验证了;使用https://www.googleapis.com/oauth2/v1/tokeninfo它返回:

{
  "issued_to": "xxxxx.apps.googleusercontent.com",
  "audience": "xxxxx.apps.googleusercontent.com",
  "scope": "https://mail.google.com/",
  "expires_in": 2083,
  "access_type": "offline"
}

问题是,使用 Google 的 POP3 服务器连接到 pop.gmail.com 进行身份验证时,相同的令牌也能正常工作。这似乎是 IMAP 特有的问题,我检查过,我正在测试的 Gmail 帐户都启用了 POP3 和 IMAP 访问。

此外,执行 XOAUTH2 身份验证的相同 IMAP 代码也适用于 Outlook 及其访问令牌。因此,当我使用最广泛的可用范围时,我不知道为什么 Google 会拒绝有效的令牌。

欢迎任何建议或见解。

4

1 回答 1

1

在做了更多的测试之后,我能够让它工作。该解决方案可能对不使用自己的 OAuth2 代码的任何人都没有帮助,但这就是问题所在。我正在像这样对 AUTHENTICATE 请求进行编码(其中 ^A 是 SOH 控制字符):

^Auser=username@gmail.com^Aauth=bearer ya29.a0AfH6SMA8fcO_RkV3sH73f.....^A^A

Google 的 POP3 服务器对此完全没有问题,Outlook 的邮件服务器也是如此。但是,Google 的 IMAP 服务器显然存在“不记名”未大写的真正问题。在查看 RFC 7628 之后,尽管在标准中明确指出:

实施者注意事项:SASL OAuth 方法名称不区分大小写。一个示例使用“Bearer”,但也可以很容易地使用“bearer”、“BEARER”或“BeArEr”。

将请求更改为使用“auth=Bearer”而不是“auth=bearer”允许客户端进行身份验证。这显然是谷歌的问题,但至少已经解决了。

于 2020-08-14T18:15:21.747 回答