我目前正在尝试使用服务帐户及其 P12 密钥连接到简单 Gmail 用户的 Imap 服务器。
如 http://code.google.com/p/java-gmail-imap/wiki/GmailAndXOAUTH2中所述,我成功地为域范围的委托服务帐户实现了它。
但是,我无法连接到普通的旧 gmail 帐户。
生成 OAuth 2.0 令牌的代码是:
public static String getAccessToken(String email) throws Exception {
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(SingleUserCredentials.SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes("https://mail.google.com/")
.setServiceAccountPrivateKeyFromP12File(
new java.io.File(SingleUserCredentials.SERVICE_ACCOUNT_PKCS12_FILE_PATH))
.setServiceAccountUser(SingleUserCredentials.EMAIL)
.build();
credential.refreshToken();
return credential.getAccessToken();
}
然后我连接到 ImapStore,如:
String authToken = getAccessToken(SingleUserCredentials.EMAIL);
OAuth2Authenticator.initialize();
IMAPStore imapSslStore = OAuth2Authenticator.connectToImap(
"imap.gmail.com",
993,
SingleUserCredentials.EMAIL,
authToken,
true);
我总是在线程“main”javax.mail.AuthenticationFailedException 中遇到异常:[ALERT] Invalid credentials (Failure)。
这里至少有两件事很奇怪:
- 带有 OAuth 2.0 私钥的 Imap 适用于 Google Apps 域的域范围委派。
- 我用于简单 gmail 帐户的证书非常适合该用户的 GDrive 和其他 Google 服务。