用于Web应用程序的AuthorizationCodeInstalledApp的Google Java API

时间:2018-04-30 15:59:29

标签: java oauth-2.0 google-api offline credentials

我对API文档和我的用例感到困惑,以及如何处理我的Web应用程序的授权令牌。我有一个Web服务,用户登录我的应用程序(不是谷歌应用程序),我需要他们提供我的服务(Java与Spring Boot)授权上传Youtube。后来,我需要能够使用该授权"离线"将视频上传到他们的频道,而不是他们登录我的服务("自动发布"类型功能)。我尝试了很多方法,并且通常都有这个方法,但是为了实现干净而遇到了一些障碍:

        GoogleAuthorizationCodeFlow flow =
                new GoogleAuthorizationCodeFlow.Builder(
                        httpTransport, JSON_FACTORY, clientSecrets, scopes)
                        .setDataStoreFactory(dataStoreFactory)
                        .setAccessType("offline")
                        .build();

        credential = new AuthorizationCodeInstalledApp(
                flow, new LocalServerReceiver()).authorize("user");

使用url生成控制台消息,以便用户在其浏览器中打开。我希望用户实际上会被重定向。我不希望这是一个手动过程,我必须在控制台,然后向用户提供从此过程返回的URL,以便他们在自己的浏览器中打开。据我所知,LocalServerReceiver用于在用户授权后处理实际的访问令牌响应。我已经详细探讨了这个问题,并且无法在示例中找到任何文档解决方案或任何内容,而这些解决方案没有产生控制台消息,并将以下网址粘贴到您的浏览器中...."使用授权网址。

我尝试使用GoogleAuthorizationCodeFlow:

        GoogleAuthorizationCodeFlow flow = (new GoogleAuthorizationCodeFlow.Builder(httpTransport, JSON_FACTORY, clientSecrets, scopes))
                .setDataStoreFactory(dataStoreFactory)
                .setAccessType("offline")
                .build();

        return flow.newAuthorizationUrl()
                .setScopes(scopes)
                .setAccessType("offline")
                .setClientId(clientSecrets.getDetails().getClientId())
                .setRedirectUri(redirectionUrl)
                .toString();

我把" / oauth2-callback"对于我的redirectionUrl,这有点(有点)。我让用户访问了Google授权页面,他们对其进行了授权,并获得了一个令牌给我的回复"终点(" / oauth2-callback"),但该令牌似乎没有得到完全授权。我将它存储在我的数据存储中,并在那里看到它,但当我尝试离线使用它时,我收到授权错误。通过更多的文档,我发现了剩下的代码,用于处理发送回我的回调的令牌:

        GoogleTokenResponse response = flow.newTokenRequest(token)
                .setRedirectUri(redirectUrl).execute();

        Credential credential = flow.createAndStoreCredential(response, "user");

这个问题是我已经在我的回调端点,这需要另一个redirectURL。授权中的令牌在脱机模式下不起作用,直到我执行此操作" newTokenRequest",这需要另一个重定向URL。它似乎需要在flow.newAuthorizationUrl()调用中的原始redirectURL,但是当执行newTokenRequest时,它会产生另一个回调到该URL的回调,并且我最终得到一个已经兑换的"令牌"错误。

在上面的任何一个场景中,使用AuthorizationCodeInstalledApp,或者使用带有回调URL的flow.newAuthorizationUrl(),我使用flow.newTokenRequest和flow.createAndStoreCredential处理令牌,我确实得到了一个我可以在以后离线使用的凭据。但是我在任何一个方面都遇到了顺畅的用户体验。

我的情景中缺少什么?

1 个答案:

答案 0 :(得分:0)

根据调用authorize方法后的文档,它会调用onAuthorization方法,最终使用browse调用authorizationUrl方法尝试自动打开浏览器。

public static void browse(String url) {
Preconditions.checkNotNull(url);
// Ask user to open in their browser using copy-paste
System.out.println("Please open the following address in your browser:");
System.out.println("  " + url);
// Attempt to open it in the browser
try {
  if (Desktop.isDesktopSupported()) {
    Desktop desktop = Desktop.getDesktop();
    if (desktop.isSupported(Action.BROWSE)) {
      System.out.println("Attempting to open that address in the default browser now...");
      desktop.browse(URI.create(url));
    }
  }
} catch (IOException e) {
  LOGGER.log(Level.WARNING, "Unable to open browser", e);
} catch (InternalError e) {
  // A bug in a JRE can cause Desktop.isDesktopSupported() to throw an
  // InternalError rather than returning false. The error reads,
  // "Can't connect to X11 window server using ':0.0' as the value of the
  // DISPLAY variable." The exact error message may vary slightly.
  LOGGER.log(Level.WARNING, "Unable to open browser", e);
}

}

它应该在尝试打开浏览器的try块内。对于运行程序的平台,Desktop.isDesktopSuported and desktop.isSupported(Action.BROWSE)是正确的。

修改:以上示例来自Gmail服务,但所有Google产品AFAIK的oauth授权流程相同。