我有一个web应用程序,以我的用户的名义发送电子邮件(gmail)
当用户注册时,她提供gmail帐户和密码。她还必须启用对不太安全的应用程序的访问(我建议为此创建一个新帐户)
然后我可以打开gmail会话
session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user.getEmail(), user.getPassword());
}
});
并代表她发送电子邮件。
不幸的是,这将在明年5月30日停止工作,届时谷歌将只允许OAUTH2访问
我已经遵循Java Gmail API快速入门,我有代码运行与OAUTH2发送电子邮件:启用Gmail API,在谷歌云平台上创建应用程序,授予发送权限,OAUTH2客户端id凭证创建…
我的问题是,我看不到一种方法来自动化这个任务,因为当创建一个授权的凭据,同意屏幕显示在浏览器上,你必须手动选择要授予的帐户(也许是因为我的应用程序在谷歌云平台仍待审查)
是否有一种方法来推断你想从凭证文件(client_secret.json)访问gmail帐户?有没有办法让它自动化?
否,或者是。这取决于.
OAuth2的全部要点是通过使用授权令牌而不是要求用户凭据来提高安全性。要做到这一点,用户必须同意应用程序的访问请求,因此OAuth同意屏幕不能被忽略。这是在谷歌的文档中解释过。这与你的应用的审查状态无关,而是OAuth的工作方式。
您仍然可以以类似的方式工作。而不是在用户注册时要求用户名和密码,你可以将他们重定向到OAuth同意屏幕,这样他们就可以授权你的应用程序。确保你的应用程序请求离线访问类型,然后你可以检索一个access_token
和一个refresh_token
。这些基本上将用作您的凭据,并且您可以在需要时使用刷新令牌生成新的访问令牌,而无需用户每次都经过同意屏幕。
刷新标记没有"natural"过期,所以你可以无限期地继续使用它,但也有一些情况下,它会变得无效,比如它没有被使用六个月,用户更改密码(如果使用Gmail范围),用户手动撤销访问等。在这种情况下,你需要再次引导他们到同意屏幕来重新授权你的应用。
从这个意义上讲,你的应用程序仍然可以在没有用户输入的情况下自动工作,除了初始设置,当他们向你提供他们的凭据时,你已经必须处理这些设置。刷新令牌过期甚至可以与用户在当前工作流中更改密码时所做的操作进行比较。一个例外是服务帐户。如果您和您的用户都是Google Workspace域的一部分,那么您可以委托域范围的访问权限,然后服务帐户将能够访问用户数据,而无需任何手动输入。当然,这是因为作为域管理员,您几乎拥有它下的所有帐户。但是,如果您使用的是公开可用的应用程序,则必须处理我上面提到的限制。
来源:
- Google授权概述
- 使用OAuth 2.0访问Google api
- web应用程序OAuth 2.0
- OAuth同意界面