如何从 GoogleCredential 获取访问令牌?

Posted

技术标签:

【中文标题】如何从 GoogleCredential 获取访问令牌?【英文标题】:How to get access token from GoogleCredential? 【发布时间】:2012-09-16 10:05:46 【问题描述】:

我正在尝试获取访问令牌以使用 Google Play android 开发者 API,而我使用 the Google API Java Client documentation example 做到了这一点:

HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
JsonFactory JSON_FACTORY = new JacksonFactory();

GoogleCredential credential = new GoogleCredential.Builder()
    .setTransport(HTTP_TRANSPORT)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId("...gserviceaccount.com")
    .setServiceAccountScopes("https://www.googleapis.com/auth/androidpublisher")
    .setServiceAccountPrivateKeyFromP12File(keyFile)
    .build();

但是我如何从这个凭证中获取访问令牌? credential.getAccessToken() 返回null。我做错了什么,还是遗漏了一些步骤?

【问题讨论】:

还要检查***.com/a/24264696/165708,您可能需要采取更多步骤才能使一切正常。 【参考方案1】:

知道了。您必须在 credential.getAccessToken() 之前调用 credential.refreshToken()。它在文档中的任何地方都没有这样说,但就是这样。

credential.refreshToken();
accessToken = credential.getAccessToken();

【讨论】:

是的,即使在谷歌文档中我也看不到它。感谢您帮助卡琳娜【参考方案2】:

如果您使用ServiceAccountCredentials.fromStream() 创建您的凭证对象,您可能还需要调用createScoped() 方法。

    FileInputStream fileInputStream = new FileInputStream(KEY_FILE_PATH);
    GoogleCredentials credentials = ServiceAccountCredentials.fromStream(fileInputStream);
    credentials = credentials.createScoped(SCOPES);
    AccessToken accessToken = credentials.refreshAccessToken();

否则会报错

java.io.IOException:未为服务帐户配置范围。范围 应通过调用 createScoped 或将范围传递给 构造函数。

【讨论】:

以上是关于如何从 GoogleCredential 获取访问令牌?的主要内容,如果未能解决你的问题,请参考以下文章

(JAVA) Google API 分析 - 无法使用“刷新令牌”获取新的“访问令牌”

类 Google.Apis.Auth.OAuth2.GoogleCredential.UnderlyingCredential.GetAccessTokenForRequestAsync() 在 Ja

访问谷歌云存储的应用引擎项目的默认凭据?

Java中的Bigtable身份验证

在 GCR 上获取当前服务帐户

如何从贝宝配置文件中获取访问令牌