我正在尝试使用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与我在谷歌开发者控制台中的应用程序客户端ID匹配,指纹具有正确的值,包名称与我的应用程序的包名称匹配,所以我做错了什么?
答案 0 :(得分:0)
没关系,这是一个初学者的错误。 IMAP命令参数的构建如下:
String para = "user=" + myuser + 0x1 + "auth=Bearer " + token + 0x1 + 0x1;
不幸的是,0x1并没有转化为^ A(ascii代码1),而是转换为1(数字1)。
我需要做的是:
String para = "user=" + myuser + (char)0x1 + "auth=Bearer " + token + (char)0x1 + (char)0x1;
我留下了这个问题,因为它包含了一些关于如何使用IMAP实现XOAUTH2的好信息,并且已经实现了XOAUTH2的每个人都知道这可能有多么混乱(考虑一个人可以找到一个主题的文档多少/过多/过时/矛盾)