我正在编写一个使用电子表格 API 的应用程序。因为我使用的是敏感的写入范围,所以 OAuth2 重定向 URI 必须使用 https 而不是 http(使用 localhost 时除外)。
我的 API 调用中使用的凭证对象是这样的:
@Bean
public Credential credential(@Autowired LocalServerReceiver localServerReceiver) throws GeneralSecurityException, IOException {
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
// Load client secrets from your credentials JSON file
InputStream credentialsStream = Talespire.class.getResourceAsStream(GOOGLE_SHEETS_CLIENT_SECRET_JSON);
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(credentialsStream));
// Set up authorization code flow
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
httpTransport, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File("tokens")))
.setAccessType("offline")
.setApprovalPrompt("force")
.build();
return new AuthorizationCodeInstalledApp(flow, localServerReceiver).authorize("user");
}
注入的
LocalServerReceiver
是使用它提供的 Builder
设置的。在我的开发环境中,我使用 localhost 作为主机进行设置,它工作正常,因为它不需要 http。但是,当迁移到生产环境时,无法将主机(用于确定回调 URL)设置为使用 https-scheme。如果将主机设置为https://app.comin.com,则生成的回调URL将变为http://https://app.domain.com/Callback
,这显然是错误的。如果我偷偷地尝试手动更改身份验证 URL 中的重定向 uri 参数(使用 https 而不是 http),则在浏览器中打开它时,我会收到来自 Google 的授权错误 (Error 400: bad_request
)。我怀疑 https 需要额外的参数或其他东西,但我找不到任何有关它的文档。
LocalServerReveiver 代码(来源https://github.com/googleapis/google-oauth-java-client/blob/main/google-oauth-client-jetty/src/main/java/com/google/api/client /extensions/jetty/auth/oauth2/LocalServerReceiver.java) 被硬编码为使用 http 方案(第 138 行),因此我没有看到使用 https 方案进行设置的内置方法,如指定的那样。
有人知道我该如何解决这个问题吗?
相关库/依赖项 LocalServerReceiver:google-oauth-client-jetty-1.34.1.jar GoogleAuthorizatoinCodeFlow:google-api-client-1.35.2.jar AuthorizationCodeInstalledApp:google-oauth-client-java6-1.34.1.jar
编辑:在阅读这篇文章时,我突然想到,AuthorizationCodeInstalledApp 可能不是用于生成 Credential 对象的正确类(基于其名称以及依赖项在其名称中使用“java6”的事实)。可能是这种情况,我需要为此使用不同的类吗?如果是这样,我应该使用哪一个?
您可以创建多种类型的应用程序。让我们看一下这两个有重定向 uri 的两个。
重定向 uri 告诉授权服务器将授权码返回到哪里。对于 Web 应用程序,它是托管应用程序的域。对于已安装的应用程序,它是本地主机或运行该应用程序的计算机。这就是为什么已安装的应用程序在代码中硬编码了一个内置的重定向 uri。
如果您要创建已安装的应用程序,请使用
AuthorizationCodeInstalledApp
并创建 本机应用程序凭据。这些凭据无法更改内置的重定向 URI。正如你所看到的。
另一方面,Web 应用程序使用 GoogleAuthorizationCodeFlow.Builder 并发送在应用程序中配置的重定向 uri。他们要求您创建网络应用程序凭据并在谷歌云控制台中配置重定向uri。
所以我怀疑您有两个问题之一。