我可以在没有用户交互的情况下进行 Gmail API 调用吗?

时间:2021-01-19 09:09:29

标签: google-api google-oauth gmail-api google-api-java-client

目前我需要使用 Gmail API 来检查新到达的电子邮件的标签。在我的笔记本电脑上非常完美,我第一次启动程序(Java)需要手动授权,后续调用不需要用户交互。

此程序是 Gmail API 的快速入门示例代码 https://developers.google.com/gmail/api/quickstart/java

现在我需要这个程序在服务器上运行,以便我可以监控登陆状态。经过数十次尝试,服务器无法检测到我从笔记本电脑上传的令牌,并不断要求我打开重定向 URL 进行授权。

gmailLog.info("getCredentials start!");
InputStream in = GmailAPI.class.getResourceAsStream("/credentials.json");
if (in == null) {
   gmailLog.error("null input stream, credentials missing");
   throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
}
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
            .setDataStoreFactory(new FileDataStoreFactory(new File("tokens")))
            .setAccessType("offline")
            .build();
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");

授权发生在代码的最后一行。 然后会生成一个tokens文件夹,请点击此链接查看 file structure

如您所见,tokens 文件夹位于根路径下。我将令牌文件夹复制到同一位置的服务器,但仍然要求我重定向。我想知道这可能是因为 StoredCredential 文件包含我机器的信息,所以它与服务器机器不匹配。

这是否意味着我永远无法在没有用户输入的情况下在服务器上执行此操作?谢谢。另外,如果绝对需要 GSuite 帐户,我愿意付费并成为企业用户。

1 个答案:

答案 0 :(得分:0)

AuthorizationCodeInstalledApp 专为已安装的应用程序设计。这是因为它会在运行代码的机器上打开授权窗口。

一旦用户授权应用程序 FileDataStoreFactory 将用户凭据(用于授权(“用户”)的刷新令牌)存储在机器上,然后只要刷新令牌仍然有效,就不需要再次授权,因为它可以请求新的访问令牌,或者如果您将“用户”更改为其他用户。

这在服务器上不起作用,因为用户现在可以授权代码,除非他们可以在自己的机器上看到授权屏幕。您可以做的只是将凭证文件与代码一起复制,以便它可以找到它并且它应该像在您的个人机器上一样工作,但是您应该监控它刷新令牌很少会过期但它们可以所以您需要如果它确实停止工作,请再次授权。如果此库与 .net 库的创建方式相同,则令牌应该是您计算机上某个位置的目录,其中包含一个以“user”结尾的文件。

网络应用

现在我不是 Java 开发人员,但是当您说在服务器上运行时,如果您的意思是作为 Web 应用程序(我什至不确定您是否可以使用 Java 执行此操作),那么您可能需要在库中检查以看看它是否支持。我不了解这个库,也不知道其他一些 Google 库,但我认为您正在寻找类似其中之一的here

您可能还想在问题表单上询问该库是否支持在服务器上运行,请记住,您可能需要网络浏览器凭据。