使用 OAuth 2.0 和服务帐户的 Gmail IMAP 失败,状态为 400
Posted
技术标签:
【中文标题】使用 OAuth 2.0 和服务帐户的 Gmail IMAP 失败,状态为 400【英文标题】:Gmail IMAP using OAuth 2.0 and Service Account fails with status 400 【发布时间】:2014-08-17 10:52:59 【问题描述】:当我尝试使用 XOAUTH2 机制和服务帐户连接到 Gmail IMAP 服务器时,我收到以下响应:
"status":"400","schemes":"Bearer","scope":"https://mail.google.com/"
我在 php 中使用的代码是:
$email = "an_user@of_a_domain.com";
require_once 'GoogleApiClient/Google_Client.php';
$client = new Google_Client();
$client->setUseObjects(true);
$gac = new Google_AssertionCredentials(
"xxxxxxxxxxx@developer.gserviceaccount.com",
'https://mail.google.com/',
file_get_contents("path/to/private/key"),
'notasecret',
'http://oauth.net/grant_type/jwt/1.0/bearer',
$email
);
$client->setApplicationName("Test App");
$client->setAssertionCredentials($gac);
$client::$auth->refreshTokenWithAssertion();
$token = $client::$auth->getAccessToken();
$authStr = base64_encode("user=" . $email . "\1auth=Bearer " . $token . "\1\1");
$response = send_command_to_imap("TAG1 AUTHENTICATE XOAUTH2 " . $authStr);
按照http://www.limilabs.com/blog/oauth2-gmail-imap-service-account 的说明,我授权访问邮件。 (当然,然后在我的测试域中重新安装了该应用程序)但我仍然失败了。
我可以得到令牌,但无法向 IMAP 进行身份验证。
我还尝试使用服务帐户访问非域谷歌用户的 Gmail IMAP(访问令牌包括“offline_token”) - 它对我来说效果很好!
有谁知道我做错了什么?
【问题讨论】:
我找到了失败的原因。我只需要 json_decode$token
并使用 $token['access_token']
值而不是 Google 返回的整个 json 字符串。
【参考方案1】:
自去年 io2014 以来,现在有了一种更简单的方式与 Gmail 集成:
https://developers.google.com/gmail/api/overview
【讨论】:
是的,我知道,但我需要 IMAP,因为 Gmail API 没有 IMAP 所拥有的一些很酷的东西 :)以上是关于使用 OAuth 2.0 和服务帐户的 Gmail IMAP 失败,状态为 400的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 OAuth 2.0 从 Indy 发送 Gmail?
如何使用 OAuth 2.0 从 Indy 发送 Gmail?