续订凭据和对Google帐户的应用访问权限后授权范围

时间:2018-12-22 16:44:23

标签: java google-app-engine web-applications oauth-2.0 gmail-api

这是我的问题。

我正在使用JAVA中的Google App引擎开发网络应用。

我已经在网上搜索了很多问题的答案,给出了各种解决方案,但没有一个对我有用,我仍然得到:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Insufficient Permission",
    "reason" : "insufficientPermissions"
  } ],
  "message" : "Insufficient Permission"
}

我正尝试从我的帐户向其他电子邮件地址发送一封邮件(作为测试,从我发送给我)。 我已经成功实现了表格API,但记得我必须先经过一个同意屏幕,但是现在我真的不知道如何再次弹出此屏幕来永久验证范围,让我自己解释一下。

我有两个凭证文件。

  1. 为了获取用户信息以确认通过Google的登录,我在这里使用了一个openID连接URL,然后我就获得了同意屏幕。
  2. 使用Sheets API和Gmail API作为“我”,首先从我的电子表格中检索数据,然后从我的电子邮件地址发送邮件。如前所述,我已经验证了Sheets API,但无法让Gmail使用相同的凭据。

我已经测试了各种范围,添加了另一个凭据文件,但没有成功。请告诉我您是否需要一些代码。

编辑

只是删除了我的Sheets API凭据,还删除了我的应用程序以链接到我的帐户,现在我无法弹出同意屏幕。然后我得到:

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "invalid_grant",
  "error_description" : "Token has been expired or revoked."
}

我正在使用此代码获取凭据

private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
    // Load client secrets.
    InputStreamReader in = new InputStreamReader(new FileInputStream(new File("WEB-INF/credentials.json")));
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, in);

    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
            .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
            .setAccessType("offline")
            .build();
    LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
    return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
}

但是Google文档说:

  

授权信息存储在文件系统上,因此后续   执行将不会提示授权。

在哪里可以删除存储的文件系统?

非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

经过数小时的混乱之后,我终于有了一个无法解释的解决方案。

我从this page删除了我的应用

然后将我的代码更改为

return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");

对此

return new AuthorizationCodeInstalledApp(flow, receiver).authorize(null);

显示同意屏幕。

然后,在验证我的应用程序后,我遇到了NullPointerException错误,因此我将同一行改回了该行

return new AuthorizationCodeInstalledApp(flow, receiver).authorize("myemail@gmail.com");

如果它不起作用(我想这是缓存问题)

对此

return new AuthorizationCodeInstalledApp(flow, receiver).authorize("me");

不要问我为什么,但这确实起作用。 仍然欢迎您提供有关此行为的更多详细信息。