oauth-2.0 - Gmail 的 XOAuth2 错误凭据无效

标签 oauth-2.0 passport.js gmail-imap

我正在使用 passport.js 作为身份验证服务从 google 获取 oauth2 访问 token (https://github.com/jaredhanson/passport-google-oauth#usage-of-oauth-20),我可以获取范围为:https://mail.google.com/ 的访问 token , https://www.googleapis.com/auth/userinfo.email . 但是,当我尝试连接到 imap(使用 https://github.com/mscdex/node-imap )时,我收到错误消息:'Invalid credentials'。

这是我正在使用的代码段:

var authData = [
"user=" + ('test@gmail.com' || ""),
"auth=Bearer " + 'ya29.LgBFSGtnPtfHLxkAAADjgeEFpUC9nD31kP5BqLKuH1MO3e_TRSdRTjEVKqQ-GQ',
"",
""];
var xoauth2_token = new Buffer(authData.join("\x01"), "utf-8").toString("base64");

var imap = new Imap({
            user: ‘test@gmail.com',
            xoauth2: xoauth2_token,
            host: 'imap.gmail.com',
            port: 993,
            tls: true,
            debug: console.log
        });
        imap.on('ready', function() {
            imap.openBox('INBOX', true, function() {
                var f = imap.seq.fetch(1);
                f.on('message', function(m) {
                    m.once('attributes', function(attrs) {
                        console.log(attrs);
                    });
                });
                f.on('end', function() {
                    imap.end();
                });
            });
        });
        imap.connect();

请求头和响应头:

[connection] Connected to host
<= '* OK Gimap ready for requests from 212.143.212.222 ce43mb7026158web'
=> 'A0 CAPABILITY'
<= '* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH AUTH=XOAUTH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN'
<= 'A0 OK Thats all she wrote! ce43mb7026158web'
=> 'A1 AUTHENTICATE XOAUTH2     dXNlcj11YXBwZmFjdG9yeUBnbWFpbC5jb20BYXV0aD1CZWFyZXIgeWEyOS5MZ0JGU0d0blB0ZkhMeGtBQUFEamdlRUZwVUM5bkQzMWtQNUJxTEt1SDFNTzNlX0dMU2RSVGpFVktxUS1HUQEB'
<= '+ eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUiOiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ=='
=> '\r\n'
<= 'A1 NO [ALERT] Invalid credentials (Failure)'

我尝试指定空密码,不带用户或不带用户,注意似乎都有效。

我也跟着谷歌网站上的例子:https://developers.google.com/gmail/xoauth2_libraries

在我的 google 帐户中,我可以看到我用于连接到 google 并获取 token 的应用程序,具有管理和查看电子邮件的授权,以及有关用户个人资料的基本详细信息。

我做错了什么?

最佳答案

我遇到了同样的问题。它与 OAuth 2.0 Scopes 有关。

首先,我是在请求访问权限:

  • https://www.googleapis.com/auth/userinfo.profile
  • https://www.googleapis.com/auth/userinfo.email

使用这些范围我得到了那个错误。

"A1 NO [ALERT] Invalid credentials (Failure)"

最后我在 Using OAuth 2.0 找到了

IMAP 和 SMTP 访问范围是 https://mail.google.com/

我请求了具有该范围的权限,并且开始工作。

var params = {
    response_type: "code",
    client_id: "YOUR_CLIENT_ID",
    redirect_uri: "REDIRECT_URI",
    scope: 'https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/',
    approval_prompt: 'force'
};

问候,

jcvalerio

关于oauth-2.0 - Gmail 的 XOAuth2 错误凭据无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24183662/

相关文章:

php - 在 php 网站上集成 IMAP

ruby - IMAP (Ruby) : Fail to fetch/save audio (. wav) 格式正确的附件

oauth-2.0 - 如何在 "Sign in with Apple"同意屏幕中设置 Logo ?

php - 谷歌认证 : OAuth2 keeps returning 'invalid_grant'

即使获得 Multi-Tenancy 应用程序的管理员同意,Azure AD 用户登录应用程序也会失败

javascript - Jsonwebtoken 如何在 Node.js Express 的 header 中保存 token

node.js - 如何在 View 中一致地访问用户是否经过身份验证

spring-boot - Spring Boot + Keycloak 使用私有(private)证书

node.js - 获取访问 token 有效性

python - 如何使用 Python 在 Gmail 中使用 IMAP 创建草稿