Gmail XOAUTH 2.0,IMAP 验证 returns "status":“400”
Gmail XOAUTH 2.0, IMAP AUTHENTICATE returns "status":"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();
他们都 return 相同的标记,所以任何一种方法似乎都有效。
returned 令牌根据以下内容有效:
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xyz
Returns:
{
"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代表0x1中的控制A)
我仍然收到回复:
{"status":"400","schemes":"Bearer","scope":"https://mail.google.com/"}
这似乎表明 "something" 令牌有误(已过期、缺少范围或诸如此类)。
我使用了正确的范围,令牌的客户端 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 的人都知道这会是多么令人困惑(考虑如何 much/little/outdated/contradicting 文档可以找到一个主题) .
我正在尝试使用 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();
他们都 return 相同的标记,所以任何一种方法似乎都有效。 returned 令牌根据以下内容有效:
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xyz
Returns:
{
"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代表0x1中的控制A)
我仍然收到回复: {"status":"400","schemes":"Bearer","scope":"https://mail.google.com/"}
这似乎表明 "something" 令牌有误(已过期、缺少范围或诸如此类)。
我使用了正确的范围,令牌的客户端 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 的人都知道这会是多么令人困惑(考虑如何 much/little/outdated/contradicting 文档可以找到一个主题) .