Gmail XOAUTH 2.0,IMAP AUTHENTICATE返回“状态”:“400”

时间:2015-10-05 17:54:38

标签: java android gmail gmail-imap

我正在尝试使用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匹配,指纹具有正确的值,包名称与我的应用程序的包名称匹配,所以我做错了什么?

1 个答案:

答案 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的每个人都知道这可能有多么混乱(考虑一个人可以找到一个主题的文档多少/过多/过时/矛盾)