Google app engine 访问令牌过期后显示用户同意屏幕

Google app engine 访问令牌过期后显示用户同意屏幕,google-app-engine,google-calendar-api,google-api-java-client,Google App Engine,Google Calendar Api,Google Api Java Client,我正在尝试将Google日历API集成到我的一个基于Spring Boot的Google应用程序引擎项目中。使用基于JAVA的google客户端api库进行授权。我向GoogleAuthorizationCodeFlow提供在我的应用程序引擎项目中创建的客户端id和密码。在第一次运行时,我得到了一个用户同意屏幕,在接受它之后,在target/tokens中创建了StoredCredential文件。在此之后,我所有的Google日历API调用都可以正常工作。过了一段时间,我猜这与访问令牌的过期有

我正在尝试将Google日历API集成到我的一个基于Spring Boot的Google应用程序引擎项目中。使用基于JAVA的google客户端api库进行授权。我向GoogleAuthorizationCodeFlow提供在我的应用程序引擎项目中创建的客户端id和密码。在第一次运行时,我得到了一个用户同意屏幕,在接受它之后,在target/tokens中创建了StoredCredential文件。在此之后,我所有的Google日历API调用都可以正常工作。过了一段时间,我猜这与访问令牌的过期有关,我再次获得用户同意屏幕。根据文档,如果访问类型设置为脱机,授权流将负责管理刷新令牌。StoredCredential文件仍在目标/令牌路径中,但我仍然可以看到用户同意屏幕。粘贴授权代码片段

  private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
    // Load client secrets.
    InputStream in = EventController.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(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");
  }

  public static Calendar get() throws GeneralSecurityException, IOException {
    // Build a new authorized API client com.huddle.processor.service.
    final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    return new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
        .setApplicationName(APPLICATION_NAME)
        .build();
  } 
更新: 远程调试时,当google oauth客户端使用

StoredCredential stored = credentialDataStore.get(userId);
刷新令牌为空。想知道这是否是原因,但不确定为什么没有设置


如果有人能让我知道我错过了什么,那就太好了。谢谢

找到了解决方案。这与无法获取刷新令牌有关。需要通过批准\u提示符=强制参数。所以更新后的代码片段是

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
        .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
        .setAccessType("offline")
        .setApprovalPrompt("force")
        .build();

参考帮助我的博客:

删除用户的凭据并让他们再次登录。如果这不起作用,请转到用户的google帐户,让他们删除对你的应用程序的授权,然后重试。您应该会得到一个访问令牌。谢谢@DaImTo,找到了解决方案并将其发布在下面