使用 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?

通过OAuth 2.0令牌撤销提高帐户安全性

Gmail API 是不是支持使用 OAuth 服务帐户?

通过服务器端的服务帐户使用 gmail api,避免使用 OAUTH2 GUI

如何在 C# 中使用带有服务帐户的 gmail api 或 google Oauth 来发送邮件?