banner
NEWS LETTER

【技术】关于适配Email OAuth2 登录情况

Scroll down

基本概况

Microsoft & Google 摒弃密码直接IMAP登录的方式。应用密码也无法登录。

参考资料

1,https://javaee.github.io/javamail/OAuth2
2,使用 OAuth 对 IMAP、POP 或 SMTP 连接进行身份验证 | Microsoft Learn
3,微软身份平台和 OAuth 2.0 授权代码流 - Microsoft identity platform | Microsoft Learn

关键代码

软件版本

1,Spring boot 3.3.0
2,JDK 21
3,Spring cloud 2023.0.1

重点

前提:完成对应平台应用的创建,以Microsoft为例
快速入门:创建 Microsoft Entra 租户 - Microsoft identity platform | Microsoft Learn

获取token:以Microsoft为例,

1,请求授权代码。此处scope参数参考“参考资料第2点中权限部分”:

微软身份平台和 OAuth 2.0 授权代码流 - Microsoft identity platform | Microsoft Learn
2,使用 client_secret 请求访问令牌。

微软身份平台和 OAuth 2.0 授权代码流 - Microsoft identity platform | Microsoft Learn
3,第二点成功后会有一个 “access_token” 的返回参数。此参数的值可用于后续登录。

登录代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

Properties properties = new Properties();
properties.setProperty("mail.imap.socks.host", "127.0.0.1");
properties.setProperty("mail.imap.socks.port", "7890");
properties.setProperty("proxySet", "true");
properties.setProperty("mail.imap.ssl.enable", "true"); // required for Gmail
properties.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
properties.setProperty("mail.imap.auth.mechanisms", "XOAUTH2");
Session emailSession = Session.getInstance(properties);

emailSession.setDebug(true);
IMAPStore store = (IMAPStore) emailSession.getStore("imap");
store.connect("imap.gmail.com" ,account, access_token);

其中核心配置是“properties.setProperty(“mail.imap.auth.mechanisms”, “XOAUTH2”);”,加入这个参数意味这你使用OAuth2的认证方式。只需要把原有的password替换为token,剩余部分javamail会帮你处理(见参考资料1)

其他文章
目录导航 置顶
  1. 1. 基本概况
  2. 2. 参考资料
  3. 3. 关键代码
    1. 3.1. 软件版本
    2. 3.2. 重点