Google api 如何在使用Google API JS客户端时获取刷新令牌

Google api 如何在使用Google API JS客户端时获取刷新令牌,google-api,google-oauth,google-api-js-client,Google Api,Google Oauth,Google Api Js Client,我一直在尝试实现一个需要用户授权访问谷歌分析的应用程序。我一直在学习本教程: 在其他一些地方有AngularJs的代码,它使用相同的函数L 我的问题是,auth工作得很好,但它不返回刷新令牌。 它从不返回刷新令牌。我已经尝试了网络上所有可能的方法。 1.第一次,, 2.使用提示=强制等。。但似乎没有任何东西返回刷新令牌。我猜那部分被客户跳过了 我需要知道当用户第一次授予访问权限时,如何获取刷新令牌,以便我可以保存它。它不会返回设计的刷新令牌。您提到的教程和代码正在使用中。此库使用用于发出需要

我一直在尝试实现一个需要用户授权访问谷歌分析的应用程序。我一直在学习本教程:

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

我的问题是,auth工作得很好,但它不返回刷新令牌。 它从不返回刷新令牌。我已经尝试了网络上所有可能的方法。 1.第一次,, 2.使用提示=强制等。。但似乎没有任何东西返回刷新令牌。我猜那部分被客户跳过了


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

它不会返回设计的刷新令牌。您提到的教程和代码正在使用中。此库使用用于发出需要授权的请求

作为:

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

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


因此,您无法通过这种方式获取刷新令牌。

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

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;
   });
});

TLDR;将查询参数设置为
response\u type='code'
access\u type='offline'


我通过授权来解决这个问题。基本上,您可以通过重定向用户来执行与“隐式”流相同的操作,但是将
响应类型
token
-->
code
(也可以设置
access\u type=offline
)。这将为您提供一个授权代码,然后您可以使用该代码发布到Google OAuth服务,该服务记录在访问令牌和ID令牌的
交换代码部分。

您好,我目前在使用Google Calendar API时遇到了相同的问题。你能解决这个问题吗?@AtsuhiroTeshima你能获得日历api的刷新令牌吗?我在Angular上也遇到了同样的问题。如果我们想使用服务器端(PHP)登录JavaScript客户端api生成的刷新访问令牌来上传youtube视频,那么该怎么办…?@usama您需要使用返回的访问令牌(由刷新令牌生成)来自youtube。引用的部分不再存在。..grantoflineAccess()方法返回代码,我们可以使用令牌API获取accessToken和refreshToken。出于某种原因,在对令牌端点调用fetch、XHR或
gapi.client.request
时,会给出
{“错误”:“重定向uri\u不匹配”,“错误描述”:“错误请求”}
@krishna_5c3如何从grantoflineaccess()返回的响应代码中获取访问令牌和刷新令牌方法?您是否可以共享令牌api链接?@chetanmekha,在获得代码后,我们将进行服务器到服务器调用以获取访问令牌和刷新令牌。以下是示例代码。
final PostMethod post=new PostMethod(“https://www.googleapis.com/oauth2/v4/token“”;post.addRequestHeader(“内容类型”application/x-www-form-urlencoded”);post.addParameter(“code”,code);post.addParameter(“client_id”,client_id);post.addParameter(“client_secret”,client_secret);post.addParameter(“redirect_uri”,redirectUrl);post.addParameter(“grant_type”,“authorization_code”)
是的,我们当然可以这样做,但你必须在JS源代码中透露你的客户机密,这显然是不可取的。我通过后端发送来解决这个问题。后端有客户机密/id。它隐藏在KMS中。