使用服务帐户对OAuth2进行Gmail身份验证

时间:2020-03-12 15:06:10

标签: java jwt gmail jakarta-mail gmail-api

我需要在我的Gmail应用程序中实现OAuth2身份验证。应用程序在没有UI的后台运行。 所以我有Google帐户(我认为这不是GSuite)。我按照此处的说明https://www.emailarchitect.net/easendmail/sdk/html/object_oauth_service_account.htm创建了一个服务帐户(但未分配产品-我没有选择的权限。可能是因为我的帐户不是GSuite吗?。)。之后,我使用JSON文件创建了用于JWT身份验证的密钥。我正在使用google-auth-library-oauth2-http库来生成access_token,并使用它来登录Gmail邮箱。 这是令牌生成的代码片段:

GoogleCredentials credentials = ServiceAccountCredentials.fromStream(new FileInputStream("path_to_json")
                                     .createScoped(Arrays.asList("https://mail.google.com"));
credentials.refreshIfExpired();
AccessToken accessToken = credentials.getAccessToken();

AccessToken已成功检索,但是当我尝试使用它进行邮箱身份验证时,我得到了javax.mail.AuthenticationFailedException: [AUTHENTICATIONFAILED] Invalid credentials (Failure)

以下是邮箱连接的代码段:

Properties props = new Properties();
props.put("mail.imap.ssl.enable", "true");
props.put("mail.imap.auth.mechanisms", "XOAUTH2");
Session session = Session.getInstance(props);
Store store = session.getStore("imap");
store.connect("imap.gmail.com", "my_acc@gmail.com", access_token);

问题是,是否有可能通过基于服务帐户数据生成的JWT对具有访问令牌的Gmail邮箱进行身份验证?甚至有可能吗?

1 个答案:

答案 0 :(得分:1)

您可以在不使用G Suite的情况下创建服务帐户,但如果要访问用户的Gmail收件箱,则需要使用“域范围内的委派”。 如您在documentation中所读:

在企业应用程序中,您可能需要以编程方式访问 用户的数据,而无需任何人工授权。 在G Suite中 域,域管理员可以授予第三方应用程序 可以在整个域范围内访问其用户数据-这称为 全域授权。为了以这种方式授权, 域管理员可以将服务帐户与OAuth 2.0结合使用。