每次我提出请求时,Youtube oAuth 都会提示授权 window

Youtube oAuth promts authorization window every time I make request

这是我为 youtube api 获取访问令牌和刷新令牌的工作流程。我正在使用参数

生成授权 url

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

来自授权 url 我收到验证码,然后我生成另一个 url 以使用来自授权 [=41] 的代码获取 access_token 和 refresh_token =] 使用这些参数

code: code, client_id: CLIENT_ID, client_secret: CLIENT_SECRET, redirect_uri: serviceCallback, state: state.callback, grant_type: "authorization_code"

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

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

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

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

新端点url

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

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

如果能提供任何形式的帮助,我将不胜感激,因为我觉得自己已经尝试了一切。

转到此帐户的 google 我的帐户设置 ---> 转到连接的应用程序和网站 ----> 管理应用程序: 那边可以看到youtube的权限是这样的:

问题是您正在使用的access token在您下次使用之前已经过期,因为您没有更新access token 手动使用 refresh token.

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

刷新令牌的概念是,如果访问令牌被破坏,就像short-lived一样,攻击者可以使用的时间段有限。 刷新令牌,如果遭到破坏,将毫无用处,因为攻击者还需要 客户端 ID客户端密码到刷新令牌以获得访问令牌。

YouTube API 文档演示了该过程 here

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

这肯定对你有用。

将以下参数添加到您的身份验证对象可能会有所帮助...取决于您的要求:

prompt: 'none'

这意味着在初始授权使用该应用后,无需获得或不需要同意。