OAuth2 IMAP доступ к сервисному аккаунту GMail - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь перенести рабочее Java приложение, получающее доступ к учетной записи Gmail по протоколу IMAP, с аутентификации по имени пользователя и паролю на OAuth2 (в настоящее время приложение работает с включенной функцией «Включить менее безопасные приложения»).

I начал с загрузки ключа JSON из консоли Google для моей учетной записи службы и смог получить токен доступа:

GoogleCredentials credentials = ServiceAccountCredentials.fromStream(
    new FileInputStream("my-account.json"))
    .createScoped(Collections.singletonList("https://mail.google.com/"));

AccessToken accessToken = credentials.refreshAccessToken();
System.out.println(accessToken.getTokenValue());
        System.out.println(accessToken.getTokenValue());

Это создает токен доступа, который я могу проверить, посетив https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=

Ответ:

{
  "issued_to": "XXXX",
  "audience": "XXXX",
  "scope": "https://mail.google.com/",
  "expires_in": 3588,
  "access_type": "online"
}

Проблема возникает, когда я пытаюсь получить доступ к учетной записи IMAP с этим токеном доступа. Каждый раз, когда я получаю , поиск не удался . Вот подробный журнал JavaMail:

DEBUG: JavaMail version 1.6.2
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: setDebug: JavaMail version 1.6.2
DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle]
DEBUG IMAP: mail.imap.fetchsize: 16384
DEBUG IMAP: mail.imap.ignorebodystructuresize: false
DEBUG IMAP: mail.imap.statuscachetimeout: 1000
DEBUG IMAP: mail.imap.appendbuffersize: -1
DEBUG IMAP: mail.imap.minidletime: 10
DEBUG IMAP: closeFoldersOnStoreFailure
DEBUG IMAP: trying to connect to host "imap.gmail.com", port 993, isSSL true
* OK Gimap ready for requests from [REMOVED_LOCAL_IP] b8mb121231068edr
A0 CAPABILITY
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH2 AUTH=PLAIN AUTH=PLAIN-CLIENTTOKEN AUTH=OAUTHBEARER AUTH=XOAUTH
A0 OK Thats all she wrote! b8mb121231068edr
DEBUG IMAP: AUTH: XOAUTH2
DEBUG IMAP: AUTH: PLAIN
DEBUG IMAP: AUTH: PLAIN-CLIENTTOKEN
DEBUG IMAP: AUTH: OAUTHBEARER
DEBUG IMAP: AUTH: XOAUTH
DEBUG IMAP: protocolConnect login, host=imap.gmail.com, user=etmfdev@etmf-dev.iam.gserviceaccount.com, password=<non-null>
DEBUG IMAP: mechanism PLAIN disabled by property: mail.imap.auth.plain.disable
DEBUG IMAP: mechanism LOGIN disabled by property: mail.imap.auth.login.disable
DEBUG IMAP: mechanism NTLM disabled by property: mail.imap.auth.ntlm.disable
A1 AUTHENTICATE XOAUTH2 [REMOVED_BASE64_ENCODED_USER_PLUS_TOKEN]
+ eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUiOiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ==
[REMOVED_BASE64_ENCODED_USER_PLUS_TOKEN]
A1 NO Lookup failed b8mb121231068edr

Эта закодированная в Base64 часть, начинающаяся с eyJZ, говорит следующее:

{"status":"400","schemes":"Bearer","scope":"https://mail.google.com/"}

Есть идеи, в чем может быть причина root? Проблема в настройке учетной записи Google или в используемом мной коде?

Java используемый код:

GoogleCredentials credentials = ServiceAccountCredentials.fromStream(
    new FileInputStream("my-account.json"))
    .createScoped(Collections.singletonList("https://mail.google.com/"));

AccessToken accessToken = credentials.refreshAccessToken();

Properties props = new Properties();
props.put("mail.imap.ssl.enable", "true");
props.put("mail.imaps.sasl.enable", "true");
props.put("mail.imaps.sasl.mechanisms", "XOAUTH2");
props.put("mail.imap.auth.xoauth2.disable", "false");
props.put("mail.imap.auth.login.disable", "true");
props.put("mail.imap.auth.plain.disable", "true");
props.put("mail.imap.auth.ntlm.disable", "true");
props.put("mail.debug", "true");
props.put("mail.debug.auth", "true");

Session session = Session.getInstance(props);
session.setDebug(true);
Store store = session.getStore("imap");

store.connect("imap.gmail.com", imapEmailAddress, accessToken.getTokenValue());
...