gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:30:10 24 4
gpt4 key购买 nike

我对 API 文档和我的用例以及如何处理我的 Web 应用程序的授权 token 感到困惑。我有一个网络服务,用户登录到我的应用程序(不是 Google 应用程序),我需要他们提供我的服务(带有 Spring Boot 的 Java)授权以上传至 Youtube。稍后,我需要能够“离线”使用该授权将视频上传到他们的 channel ,而无需他们登录到我的服务(“自动发布”类型功能)。我已经尝试了多种方法,并且通常都可以正常工作,但在干净的实现方面遇到了一些障碍:

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

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

生成一 strip 有 URL 的控制台消息,以供用户在浏览器中打开。我本来希望用户实际上会被重定向。我不希望这是一个手动过程,我必须在控制台上,然后向用户提供从此过程返回的 url,以便他们在自己的浏览器中打开。据我了解,LocalServerReceiver 用于在用户授予授权后处理实际的访问 token 响应。我已经对此进行了详细的探索,但在示例中找不到任何文档解决方案或任何内容,这些解决方案不会产生一条控制台消息,以影响“将以下网址粘贴到您的浏览器中......”以及授权网址。

我尝试使用 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 授权页面,他们对其进行授权,然后我获得一个到我的“回调”端点的 token (“/oauth2-callback”),但该 token 似乎没有得到完全授权。我将其存储在我的数据存储中,并在那里看到它,但是当我尝试离线使用它时,出现授权错误。通过查看更多文档,我发现了用于处理发送回回调的 token 的剩余代码:

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

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

问题是我已经在我的回调端点中,并且需要另一个重定向URL。在我执行此“newTokenRequest”之前,授权 token 无法在离线模式下工作,这需要另一个重定向 URL。它似乎需要 flow.newAuthorizationUrl() 调用中的原始重定向URL,但是当执行 newTokenRequest 时,它会产生另一个对该 URL 的回调,最终出现“ token 已兑换”错误。

在上述任一场景中,使用 AuthorizationCodeInstalledApp 或使用 flow.newAuthorizationUrl() 以及我使用 flow.newTokenRequest 和 flow.createAndStoreCredential 处理 token 的回调 url,我确实获得了一个稍后可以离线使用的凭证。但我在任一方面都无法获得流畅的用户体验。

我的场景中缺少什么?

最佳答案

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

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 block 内。查找Desktop.isDesktopSuported 并且desktop.isSupported(Action.BROWSE)对于您运行程序的平台来说是正确的。

编辑:以上示例取自 Gmail 服务,但据我所知,所有 Google 产品的 oauth 授权流程都是相同的。

关于java - 用于 Web 应用程序的 AuthorizationCodeInstalledApp 的 Google Java API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50104138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com