Java Gmail XOAUTH 2.0,IMAP认证返回“;“地位”:&引用;400“;

Java Gmail XOAUTH 2.0,IMAP认证返回“;“地位”:&引用;400“;,java,android,gmail,gmail-imap,Java,Android,Gmail,Gmail Imap,我正在尝试使用XOAUTH2来验证对Gmail的IMAP调用(是的,我知道有一个Gmail API,但我有坚持使用IMAP的理由) 我通过以下任一方式获得有效令牌: GoogleAuthUtil.getToken(Context context, String account, "oauth2:" + GmailScopes.MAIL_GOOGLE_COM) 或 它们都返回相同的令牌,因此两种方法似乎都有效。 根据以下说明,返回的令牌是有效的: 返回: { "issued_to": "my

我正在尝试使用XOAUTH2来验证对Gmail的IMAP调用(是的,我知道有一个Gmail API,但我有坚持使用IMAP的理由)

我通过以下任一方式获得有效令牌:

GoogleAuthUtil.getToken(Context context, String account, "oauth2:" + GmailScopes.MAIL_GOOGLE_COM)

它们都返回相同的令牌,因此两种方法似乎都有效。 根据以下说明,返回的令牌是有效的:

返回:

{
 "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编码部分为:

用户=伊曼纽尔。moecklin@gmail.com^Aauth=ya29.awkaj0l6wm06wxmd4rhil0yhrsnwyij9xpslcrhhx2xffup5f8ibpttomjgp8welkucyq^A^A^A^A

(^A代表控件A,如0x1中所示)

我仍然得到答复: {“状态”:“400”,“方案”:“持有人”,“范围”:“}

这似乎表明令牌“有问题”(过期、缺少作用域或诸如此类)


我使用了正确的作用域,令牌的客户端id与Google开发者控制台中我的应用程序的客户端id匹配,指纹具有正确的值,包名与我的应用程序的包名匹配,那么我做错了什么?

不管怎样,这是初学者的错误。 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的人都知道这会有多混乱(考虑到在这个主题中可以找到多少/很少/过时/矛盾的文档)

String para = "user=" + myuser + (char)0x1 + "auth=Bearer " + token + (char)0x1 + (char)0x1;