这是我为 youtube api 获取访问 token 和刷新 token 的工作流程。我用参数生成授权网址
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 来获取访问 token 和刷新 token
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 应该检查我是否有刷新 token ,所以我的结论是我不完全理解它应该如何工作,或者我正在以某种方式测试自动强制授权提示的调试或测试模式下的所有内容。
我真的很感激任何形式的帮助,因为我觉得我已经尝试了一切。
最佳答案
问题 是access token
您正在使用的已在您下次使用之前过期 没有更新access token
手动使用 refresh token
.
您需要使用 refresh token
更新 access token
如果 [ (您上次更新访问 token 的时间) + (到期时间) ] 已经超过。
的概念刷新 token 是如果 访问 token 受到威胁,因为它是短暂的,攻击者可以使用它的时间有限。 刷新 token ,如果受到威胁,将毫无用处,因为攻击者需要 客户 ID 和 客户 secret 除了刷新 token 以获得访问 token 。
YouTube API 文档演示了该过程 here
默认情况下,到期时间约为 3 秒。
这肯定会适用于您的情况。
关于oauth - 每次我提出请求时,Youtube oAuth 提示授权窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41346250/