每次我提出请求时 Youtube oAuth 提示授权窗口
Posted
技术标签:
【中文标题】每次我提出请求时 Youtube oAuth 提示授权窗口【英文标题】:Youtube oAuth promts authorization window every time I make request 【发布时间】:2017-05-11 19:18:03 【问题描述】:这是我获取 youtube api 的访问令牌和刷新令牌的工作流程。我用参数生成授权 url
access_type=offline、response_type=code、redirect_uri=uri、scope=scopes、state=state、client_id=id
从授权 url 我正在接收身份验证代码,然后我正在生成另一个 url 以使用来自授权 url 的代码和这些参数来获取 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 ,而不是在请求时强制它。
这是我获取身份验证网址的代码部分
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 文档提供的一对一的不同,并从数据变量中删除了状态参数,但仍然没有解决问题
新的端点网址
var endpoint = "https://accounts.google.com/o/oauth2/token";
我现在真的很困惑,因为我没有强制授权,并且在谷歌应用程序部分有我的应用程序已经授权并且它没有更新授权,这意味着它只在第一次和之后我按下时授予权限允许它不做任何事情。 OAuth 应该检查我是否有刷新令牌,所以我的结论是我不完全了解它应该如何工作,或者我以某种方式在自动强制提示授权的调试或测试模式下测试所有内容。
我会非常感谢任何形式的帮助,因为我觉得我尝试了一切。
【问题讨论】:
您需要自己发布代码。您应该只在代码中提示用户身份验证一次。一旦你有了一个刷新令牌,你就可以在你想请求一个新的访问令牌时使用它。您的问题可能与您在不需要时一直请求用户访问这一事实有关。 【参考方案1】:转到此帐户的谷歌我的帐户设置--->转到连接的应用程序和网站---->管理应用程序: 在那里你可以看到这样的 youtube 权限:
【讨论】:
这甚至没有远程尝试解决这个问题。 它可能,因为这是所有权限都存在于谷歌应用程序或任何第三方应用程序的地方。如果此处不存在权限,则必须添加它,以免它不断重复请求权限。 它添加了我需要的所有权限并且它不会从那里消失【参考方案2】:问题是您使用的access token
在您下次使用之前已经过期,因为您没有使用refresh token
手动更新access token
强>.
如果[(您上次更新访问令牌的时间)+(到期时间)]已经超过,您需要使用refresh token
更新access token
。
刷新令牌的概念是,如果一个访问令牌被攻破,由于它是短暂的,攻击者有一个有限的时间段可以被攻击用过的。 刷新令牌如果被攻破,将毫无用处,因为除了刷新令牌之外,攻击者还需要 client id 和 client secret 才能获得访问令牌。
YouTube API 文档演示了过程here
默认情况下,到期时间约为 3 秒。
这肯定会适用于您的情况。
【讨论】:
【参考方案3】:将以下参数添加到您的身份验证对象可能会有所帮助...取决于您的要求:
prompt: 'none'
这意味着在获得使用应用程序的初始授权后,无需获得或不需要同意。
【讨论】:
以上是关于每次我提出请求时 Youtube oAuth 提示授权窗口的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Google YouTube Data API OAuth 2 iOS 获取刷新令牌
Youtube Data API - 如何避免 Google OAuth 重定向 URL 授权