java Gmail XOAUTH 2.0,IMAP身份验证返回“状态”:“400”
我正在尝试使用XOAUTH2来验证对Gmail的IMAP调用(是的,我知道有一个Gmail API,但我有坚持使用IMAP的理由)
我通过以下任一方式获得有效令牌:
GoogleAuthUtil.getToken(Context context, String account, "oauth2:" + GmailScopes.MAIL_GOOGLE_COM)
或
GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(
context, Arrays.asList(SCOPES))
.setBackOff(new ExponentialBackOff())
.setSelectedAccountName(account);
credential.getToken();
它们都返回相同的令牌,因此两种方法似乎都有效。 根据以下说明,返回的令牌是有效的:
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xyz
返回:
{
"issued_to": "myclientid....apps.googleusercontent.com",
"audience": "myclientid....apps.googleusercontent.com",
"scope": "https://mail.google.com https://mail.google.com/",
"expires_in": 619,
"access_type": "online"
}
尽管如此,如果我在imap会话中调用了AUTHENTICATE,如下所示:
AUTHENTICATE XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYXJlciB2RjlkZnQ0cW1UYzJOdmIzUmxja0JoZEhSaGRtbHpkR0V1WTI5dENnPT0BAQo=
base64编码部分为:
user=emanuel.moecklin@gmail.com^Aauth=Bearer ya29.AwKAJ0L6Wm06wxMd4rhIl0YHrsnnWyIJ9XPSlCRhhx2XffuP5F8ibptTOMjGP8WELkUCYQ^A^A
(^A代表控件A,如0x1中所示)
我仍然得到答复: {“状态”:“400”,“方案”:“持有人”,“范围”:“https://mail.google.com/”
这似乎表明令牌“有问题”(过期、缺少作用域或诸如此类)
我使用了正确的作用域,令牌的客户端id与Google开发者控制台中我的应用程序的客户端id匹配,指纹具有正确的值,包名与我的应用程序的包名匹配,那么我做错了什么
# 1 楼答案
别担心,这是初学者的错误。 IMAP命令参数的构建方式如下:
不幸的是,0x1没有转换成^A(ascii代码1),而是转换成1(数字1)
我需要做的是:
我留下这个问题是因为它包含了一些关于如何用IMAP实现XOAUTH2的好信息,每个实现过XOAUTH2的人都知道这会有多混乱(考虑到在这个主题中可以找到多少/很少/过时/矛盾的文档)