如何在使用Google API JS Client时获取刷新令牌

时间:2014-06-27 14:21:55

标签: google-api google-oauth google-api-js-client

我一直在尝试实施一个需要用户授予Google Analytics访问权限的应用。我一直在关注本教程:

https://developers.google.com/analytics/solutions/articles/hello-analytics-api

在其他一些地方,AngularJs的代码使用相同的functionL

https://gist.github.com/jakemmarsh/5809963

我的问题是,auth工作得很好,但它没有返回refresh_token。 它永远不会返回refresh_token。我已经尝试了网上所有可能的功能。  1.第一次,  2.使用prompt = force等等。但似乎没有返回refresh_token。我猜这个部分被客户端或其他东西所忽略。

我需要知道当用户第一次授予访问权限时如何获取refresh_token,以便我可以保存它。

3 个答案:

答案 0 :(得分:20)

它不会按设计返回刷新令牌。您提到的教程和代码正在使用Google APIs Client Library for JavaScript。该库使用OAuth 2.0 client-side flow来发出需要授权的请求。

作为The OAuth 2.0 Authorization Framework says

  

隐式授权类型用于获取访问令牌(它不支持刷新令牌的发布),并针对已知操作特定重定向URI的公共客户端进行了优化。这些客户端通常使用脚本语言(如JavaScript)在浏览器中实现。

实际上,授权代码流是唯一一个发布刷新令牌的流程,Google在这些场景中支持此流程:Web服务器应用程序,已安装的应用程序和有限输入设备上的应用程序,但不支持客户端(JavaScript) )应用程序或服务帐户。 Get more details from here

所以你不会以这种方式获得刷新令牌。

答案 1 :(得分:4)

不确定这是否正确,但我可以使用以下代码获取刷新令牌:

window.gapi.client.init({
  apiKey: this.GOOGLE.API_KEY,
  clientId: this.GOOGLE.CLIENT_ID,
  discoveryDocs: DISCOVERY_DOCS,
  scope: SCOPES
}).then(()=>{
  const authInstance = window.gapi.auth2.getAuthInstance();
  authInstance.grantOfflineAccess()
   .then((res) => {
      console.log(res);
      this.data.refreshToken = res.code;
   });
});

答案 2 :(得分:1)

TLDR;将查询参数设置为response_type='code'access_type='offline'

我通过进行"server" flow授权来解决此问题。基本上,您通过重定向用户来执行与“隐式”流程相同的操作,但是将response_typetoken-> code(也设置为access_type=offline)进行更改。这为您提供了一个授权代码,您可以将其用于发布到Exchange code for access token and ID token部分中记录的Google OAuth服务中。