Oauth 2.0 JavaMail、GMail和OAUTH2(非Android)的问题

Oauth 2.0 JavaMail、GMail和OAUTH2(非Android)的问题,oauth-2.0,gmail,jakarta-mail,gmail-imap,sasl,Oauth 2.0,Gmail,Jakarta Mail,Gmail Imap,Sasl,我在非android环境下用JavaMail连接GMail时遇到问题。我得到了一个OAuth2访问令牌,我相信这是正确的。但是,当我尝试使用此访问令牌进行连接时,出现了一个异常: javax.mail.AuthenticationFailedException:[AUTHENTICATIONFAILED]无效凭据(失败) 在我看来,Java SASL代码需要两个返回值(用户名和密码回调?),但只得到一个 我将问题归结为以下代码: import java.io.IOException; impor

我在非android环境下用JavaMail连接GMail时遇到问题。我得到了一个OAuth2访问令牌,我相信这是正确的。但是,当我尝试使用此访问令牌进行连接时,出现了一个异常:

javax.mail.AuthenticationFailedException:[AUTHENTICATIONFAILED]无效凭据(失败)

在我看来,Java SASL代码需要两个返回值(用户名和密码回调?),但只得到一个

我将问题归结为以下代码:

import java.io.IOException;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;

public class TestImap {

    private String userId;
    private String accessToken;

    public TestImap(String[] args) {
        userId = args[0];
        accessToken = args[1];
    }

    public void connectImap()
        throws MessagingException
    {
        System.out.println("Connecting to gmail with IMAP and OAUTH2.");
        Properties props = new Properties();
        props.put("mail.imaps.ssl.enable", "true");
        props.put("mail.imaps.sasl.enable", "true");
        props.put("mail.imaps.sasl.mechanisms", "XOAUTH2");
        props.put("mail.imaps.auth.login.disable", "true");
        props.put("mail.imaps.auth.plain.disable", "true");
        props.put("mail.debug.auth", "true");
        /*
        props.put("mail.imaps.sasl.mechanisms.oauth2.oauthToken",
                    accessToken);
        */
        System.out.println("Creating session...");
        Session session = Session.getInstance(props);
        session.setDebug(true);
        System.out.println("Creating store...");
        Store store = session.getStore("imaps");
        System.out.println("Connecting store...");
        store.connect("imap.gmail.com", 993, userId, accessToken);
        System.out.println("Store connected.  If we get here, things work.");
    }

    public static void main(String[] args) {
        TestImap test = new TestImap(args);
        try {
            test.connectImap();
        } catch (Throwable e) {
            System.out.println("Died throwing an exception: ");
            e.printStackTrace();
        }
    }

}
当运行时,将提供以下输出:

Connecting to gmail with IMAP and OAUTH2.
Creating session...
DEBUG: setDebug: JavaMail version 1.5.3
Creating store...
DEBUG: getProvider() returning javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle]
DEBUG IMAPS: mail.imap.fetchsize: 16384
DEBUG IMAPS: mail.imap.ignorebodystructuresize: false
DEBUG IMAPS: mail.imap.statuscachetimeout: 1000
DEBUG IMAPS: mail.imap.appendbuffersize: -1
DEBUG IMAPS: mail.imap.minidletime: 10
DEBUG IMAPS: disable AUTH=LOGIN
DEBUG IMAPS: disable AUTH=PLAIN
DEBUG IMAPS: enable SASL
DEBUG IMAPS: SASL mechanisms allowed: XOAUTH2
DEBUG IMAPS: closeFoldersOnStoreFailure
Connecting store...
DEBUG IMAPS: trying to connect to host "imap.gmail.com", port 993, isSSL true
* OK Gimap ready for requests from 162.243.86.176 d92mb281521696qgf
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! d92mb281521696qgf
DEBUG IMAPS: AUTH: XOAUTH
DEBUG IMAPS: AUTH: XOAUTH2
DEBUG IMAPS: AUTH: PLAIN
DEBUG IMAPS: AUTH: PLAIN-CLIENTTOKEN
DEBUG IMAPS: protocolConnect login, host=imap.gmail.com, user=bhurt42@gmail.com, password=<non-null>
DEBUG IMAPS: SASL Mechanisms:
DEBUG IMAPS:  XOAUTH2
DEBUG IMAPS: 
DEBUG IMAPS: SASL client XOAUTH2
DEBUG IMAPS: SASL callback length: 2
DEBUG IMAPS: SASL callback 0: javax.security.auth.callback.NameCallback@268d5581
DEBUG IMAPS: SASL callback 1: javax.security.auth.callback.PasswordCallback@8e89bed
A1 AUTHENTICATE XOAUTH2 dXNlcj1iaHVydDQyQGdtYWlsLmNvbQFhdXRoPUJlYXJlciB5YTI5LldBRjY1ZGZZT3YyWEdTdkozOWdTUEswN2ZHeWhCdFNjeWp0WFlGTHliN2NobHAyemlFa0MtNFo2UWdmMG9UQWR4b2NiZXpHX2ZPdW91dwEB
+ eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUiOiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ==
DEBUG IMAPS: SASL no response

A1 NO [AUTHENTICATIONFAILED] Invalid credentials (Failure)
Died throwing an exception: 
javax.mail.AuthenticationFailedException: [AUTHENTICATIONFAILED] Invalid credentials (Failure)
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:722)
    at javax.mail.Service.connect(Service.java:364)
    at TestImap.connectImap(TestImap.java:38)
    at TestImap.main(TestImap.java:45)
使用IMAP和OAUTH2连接到gmail。
正在创建会话。。。
调试:setDebug:JavaMail版本1.5.3
正在创建存储。。。
调试:getProvider()返回javax.mail.Provider[STORE,imaps,com.sun.mail.imap.imapssltore,Oracle]
调试IMAPS:mail.imap.fetchsize:16384
调试IMAPS:mail.imap.ignorebodystructuresize:false
调试IMAPS:mail.imap.statuscachetimeout:1000
调试IMAPS:mail.imap.appendbuffersize:-1
调试IMAPS:mail.imap.minidletime:10
调试IMAPS:禁用身份验证=登录
调试IMAPS:禁用AUTH=PLAIN
调试IMAPS:启用SASL
调试IMAPS:允许的SASL机制:XOAUTH2
调试IMAPS:closeFoldersOnStoreFailure
连接存储。。。
调试IMAPS:尝试连接到主机“imap.gmail.com”,端口993,isSSL true
*OK Gimap准备好接受162.243.86.176 d92mb281521696qgf的请求
A0能力
*功能IMAP4rev1取消选择空闲命名空间配额ID XLIST子项X-GM-EXT-1 XYZZY SASL-IR AUTH=XOATH AUTH=XOATUH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN
好的,她就写这些!d92mb281521696qgf
调试IMAPS:AUTH:XOAUTH
调试IMAPS:AUTH:XOAUTH2
调试IMAPS:AUTH:PLAIN
调试IMAPS:AUTH:PLAIN-CLIENTTOKEN
调试IMAPS:protocolConnect登录,主机=imap.gmail.com,用户=bhurt42@gmail.com,密码=
调试IMAPS:SASL机制:
调试IMAPS:XOAUTH2
调试IMAP:
调试IMAPS:SASL客户端XOAUTH2
调试IMAPS:SASL回调长度:2
调试IMAPS:SASL回调0:javax.security.auth.callback。NameCallback@268d5581
调试IMAPS:SASL回调1:javax.security.auth.callback。PasswordCallback@8e89bed
A1认证XOAUTH2 DXNLCJ1IAHVYDDQYQGDTYWLSLMNVBQFHDXROPUJLYXJLCIB5YLLDBRJY1ZGZZZZT3YYWEDDKOZOWDTUWDTUEWN2WHCDFNJEWP0WFLGTHILIN2NOBDHAYEMLFA0MTNFO2UWDMG9UQWR4B2NIZPHX2ZPDW91DWEB
+EYJZDGF0DXMIOII0MDAILCZY2HLBWVZIJOIQMVHCMVYIIWIC2NVCGUIOIJODHRWCZOVL21HAWWUZ29VZ2XLMNVBS8IFQ==
调试IMAPS:SASL无响应
A1无[AUTHENTICATIONFAILED]无效凭据(失败)
引发异常时死亡:
javax.mail.AuthenticationFailedException:[AUTHENTICATIONFAILED]无效凭据(失败)
在com.sun.mail.imap.IMAPStore.protocolConnect上(IMAPStore.java:722)
在javax.mail.Service.connect(Service.java:364)
位于TestImap.connectImap(TestImap.java:38)
位于TestImap.main(TestImap.java:45)
这是JavaMail 1.5.3的一部分。我在谷歌上搜索过这个问题,到目前为止,我找到的大多数答案都足够古老,我很确定它们早于JavaMail在本地支持谷歌


任何帮助都将不胜感激。谢谢。

回答我自己的问题:问题是应用程序没有将电子邮件作用域包含在它请求的作用域中。请参阅此处:在中添加电子邮件范围修复了此问题。谢谢!!!我自己也有同样的问题,可能是因为上的示例使用了“email”的范围。将范围设置为“”解决了问题。我也面临同样的问题。您能告诉我在哪里设置吗?