16

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

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

在其他一些地方,AngularJs 的代码使用了相同的函数L

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

我的问题是,身份验证工作得很好,但它没有返回 refresh_token。它从不返回 refresh_token。我已经尝试了网络上所有可能的方法。1.第一次,2.使用prompt=force等。但似乎没有返回refresh_token。我猜那部分被客户跳过了。

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

4

3 回答 3

28

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

正如OAuth 2.0 授权框架所说

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

事实上,授权码流程是唯一发出刷新令牌的流程,Google 在以下场景中支持此流程:Web 服务器应用程序、已安装的应用程序和有限输入设备上的应用程序,但不支持客户端 (JavaScript) 应用程序或服务帐户。从这里获取更多详细信息

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

于 2014-06-28T15:30:01.267 回答
12

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

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;
   });
});
于 2018-04-15T14:01:53.500 回答
1

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

我通过执行“服务器”流授权解决了这个问题。基本上,您通过重定向用户来执行与“隐式”流相同的操作,但更改response_typefrom token--> code(也是 set access_type=offline)。这会为您提供一个授权代码,然后您可以使用该代码发布到该部分中记录的 Google OAuth 服务Exchange code for access token and ID token

于 2020-01-25T00:19:29.360 回答