【问题标题】:How do I refresh the OAuth Token when using Google Cloud SQL JDBC Driver?使用 Google Cloud SQL JDBC 驱动程序时如何刷新 OAuth 令牌?
【发布时间】:2013-10-16 08:14:46
【问题描述】:

我正在使用 Google 计算实例上的 Google Cloud SQL 驱动程序在长时间运行的批处理过程中将结果保存到 Google Cloud SQL 数据库。

在某个时候,可能在运行的第一个小时之后,oAuth 令牌似乎过期了,并且所有后续请求都失败了:

Caused by: java.sql.SQLException: 400 Bad Request
{
   "error" : "unauthorized_client"
}
at com.google.cloud.sql.jdbc.internal.googleapi.RpcGoogleApi.newOpenConnectionIOException(RpcGoogleApi.java:168)
at com.google.cloud.sql.jdbc.internal.googleapi.RpcGoogleApi.openConnection(RpcGoogleApi.java:104)
at com.google.cloud.sql.jdbc.internal.SqlProtoClient.openConnection(SqlProtoClient.java:58)
at com.google.cloud.sql.jdbc.Driver.connect(Driver.java:66)
at com.google.cloud.sql.Driver.connectImpl(Driver.java:109)
at com.google.cloud.sql.Driver.connect(Driver.java:98)
at com.google.cloud.sql.Driver.connect(Driver.java:31)

我可以中止该过程,从客户端行运行 google_sql.sh 并重新启动批处理,并且连接会正常,直到令牌再次过期。

显然,命令行工具正在做一些事情来在连接之前刷新令牌;我如何为我的批处理做同样的事情?

【问题讨论】:

  • 什么是 google_sql.sh?
  • @pinoyyid google_sql.sh 是 google cloud sdk 中提供的命令行实用程序,它启动 com.google.cloud.sql.tool.googleapi.SqlTool。这显然可以刷新身份验证令牌,但没有记录。
  • 知道了。我会做一些挖掘工作
  • 如果我找到源代码,我会好好看看。同时,根据您的问题,我将其称为 SDK 中的一个错误,即它没有刷新访问令牌,正如您所说,该令牌在整点到期。您可以尝试一种解决方法。该错误可能仅存在于命令行模式下(基于他们不希望单个命令持续超过一小时)。可能是在交互模式下,它们具有基于交互会话可以长期存在的刷新逻辑。所以尝试在交互模式下运行并输入你的命令。

标签: google-api google-oauth google-api-java-client google-cloud-sql


【解决方案1】:

Cloud SQL 团队正在努力改进 Compute Engine 的连接性。如果您将此问题发送至 google-cloud-sql-discuss@googlegroups.com,他们将能够跟进。

https://groups.google.com/forum/#!forum/google-cloud-sql-discuss

【讨论】:

    【解决方案2】:

    Cloud SQL 工具的客户端 ID 和密码需要提供给 JDBC 驱动程序,因为我们使用的是该特定工具检索到的令牌:https://developers.google.com/cloud-sql/docs/external

    Properties props = new Properties()
    props.put("oauth2ClientId", "32555940559.apps.googleusercontent.com");
    props.put("oauth2ClientSecret", "ZmssLNjJy2998hD4CTg2ejr2");
    DriverManager.getConnection("jdbc:google:rdbms://instance_name/database_name", props);
    

    如果您像我一样使用 Hibernate,您可以将其添加到 persistence.xml:

    <persistence-unit name="renjin-repo" transaction-type="RESOURCE_LOCAL">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      ...
      <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/>
    
        <property name="javax.persistence.jdbc.driver" value="com.google.cloud.sql.Driver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:google:rdbms://project:instance/database_name"/>
        <property name="javax.persistence.jdbc.user" value="root"/>
    
        <property name="hibernate.connection.oauth2ClientId" value="32555940559.apps.googleusercontent.com"/>
        <property name="hibernate.connection.oauth2ClientSecret" value="ZmssLNjJy2998hD4CTg2ejr2"/>
        <property name="hibernate.connection.pool_size" value="0" />
      </properties>
    </persistence-unit>
    

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      相关资源
      最近更新 更多