我对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处理令牌,我确实得到了一个我可以在以后离线使用的凭据。但是我在任何一个方面都遇到了顺畅的用户体验。
我的情景中缺少什么?
答案 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授权流程相同。