Youtube oAuth每次提出请求时都会提出授权窗口

时间:2016-12-27 13:39:05

标签: oauth oauth-2.0 youtube-api google-oauth youtube-data-api

以下是获取youtube api的访问令牌和刷新令牌的工作流程。我正在生成带参数的授权网址

  

access_type = offline,response_type = code,redirect_uri = uri,scope = scopes,state = state,client_id = id

从授权网址我收到验证码,然后我使用这些参数使用授权网址中的代码生成另一个网址来获取access_token和refresh_token

  

代码:code,client_id:CLIENT_ID,client_secret:CLIENT_SECRET,redirect_uri:serviceCallback,state:state.callback,grant_type:“authorization_code”

据我所知,用户应该只完成一次这个过程,然后它应该是自动的。我的问题是我总是需要完成授权,并且我总是获得新的access_token和refresh_token,而不是强制要求。

这是我获取身份验证网址的代码部分

getAuthUrl: function(scopes, applicationCallback, serviceCallback, siteId,
selectChannel, websiteUrl) {
var requestedClientId = CLIENT_ID;
var scopess =
  "https://www.googleapis.com/auth/yt-analytics.readonly https://www.googleapis.com/auth/youtube.readonly https://www.googleapis.com/auth/userinfo.email " +
  scopes.replace(",", " ");

return "https://accounts.google.com/o/oauth2/auth?" +
  "access_type=offline" +
  "&response_type=code" +
  /*"&approval_prompt=auto" +*/
  "&redirect_uri=" + serviceCallback +
  "&scope=" + scopes +
  "&state=" + JSON.stringify({
    service: NAME,
    callback: applicationCallback,
    scopes: scopes,
    siteId: siteId,
    selectChannel: selectChannel,
    websiteUrl: websiteUrl
  }) +
  "&client_id=" + requestedClientId;
  },

从那里我得到代码并使用该代码,clientID和clientSecret来获取访问令牌和刷新令牌

getAuthTokens: function(code, state, res, serviceCallback) {
// Google oAuth endpoint
var endpoint = "https://www.googleapis.com/oauth2/v4/token";
const scopes = state.scopes.split(" ");
// Setup request data
var data = {
  code: code,
  client_id: CLIENT_ID,
  client_secret: CLIENT_SECRET,
  redirect_uri: serviceCallback,
  state: state.callback,
  grant_type: "authorization_code"
};


request.post(endpoint).send(data).type('form').set('Accept',
      'application/json').end(function(err, oAuthResponse) {});
    },

我使用了错误的端点网址我将其更改为由youtube api文档提供的不同的一对一,并从数据变量中删除了状态参数但仍然无法解决问题

新端点网址

var endpoint = "https://accounts.google.com/o/oauth2/token";

我现在真的很困惑,因为我没有强制授权,在谷歌应用程序部分有我的应用程序已经授权,它没有更新授权,这意味着它只是第一次授予权限,之后我按允许它什么都不做。 OAuth应该检查我是否有刷新令牌,所以我的结论是我不完全理解它应该如何工作,或者我在某种程度上测试调试或测试模式下的所有内容,其中授权提示被自动强制。

我会非常感谢任何帮助,因为我觉得我尝试了一切。

3 个答案:

答案 0 :(得分:5)

问题是您使用的access token在您下次使用之前已过期,因为未使用{手动更新access token {1}}

如果[(您上次更新访问令牌的时间)+(到期时间)]已经超过,您需要使用refresh token来更新refresh token

刷新令牌的概念是,如果访问令牌受到损害,因为它是短暂的,攻击者的有效时间有限用过的。 刷新令牌,如果受到攻击,则无用,因为除了刷新令牌之外,攻击者还需要客户端ID 客户端密钥才能获得访问令牌。

YouTube API文档演示了here

程序

默认情况下,到期时间约为3秒。

这肯定会适用于您的情况。

答案 1 :(得分:0)

根据您的要求,将以下参数添加到身份验证对象可能会有所帮助...

prompt: 'none'

这意味着在最初获得使用该应用程序的授权后,无需征得同意。

答案 2 :(得分:-1)

转到此帐户的Google帐户设置--->转到关联的应用和网站---->管理应用: 你可以在那里看到youtube的权限:enter image description here