每当我提出请求时,Youtube oAuth都会授权授权窗口

kos*_*sas 6 oauth youtube-api oauth-2.0 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;
  },
Run Code Online (Sandbox Code Playgroud)

从那里我得到代码并使用该代码,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) {});
    },
Run Code Online (Sandbox Code Playgroud)

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

新端点网址

var endpoint = "https://accounts.google.com/o/oauth2/token";
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

问题是,access token您正在使用已使用为你下一次过期之前未更新access token使用手动refresh token.

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

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

YouTube API文档演示了此处的过程

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

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