Javascript 刷新访问令牌express js
我有一个express服务器,可以从端点获取播客列表 这很好,但是我在请求中使用了一个令牌来授权进入端点 获取访问令牌时的响应如下所示:Javascript 刷新访问令牌express js,javascript,node.js,express,Javascript,Node.js,Express,我有一个express服务器,可以从端点获取播客列表 这很好,但是我在请求中使用了一个令牌来授权进入端点 获取访问令牌时的响应如下所示: { access_token: '8c9d31761cbd32da25f1f1b988b527cde01c9d8a', expires_in: 604800, token_type: 'Bearer', scope: 'podcast_read episode_read podcast_update episode_publish' } 我有一个
{ access_token: '8c9d31761cbd32da25f1f1b988b527cde01c9d8a',
expires_in: 604800,
token_type: 'Bearer',
scope: 'podcast_read episode_read podcast_update episode_publish' }
我有一个刷新令牌,我在刷新令牌时使用它,它工作得很好
我目前的做法是,我有一个保存令牌的文本文件,应用程序在发出请求时从中读取,我设置了一个函数,每次调用播客路由时都会调用该函数router.get('/podcast',checkIfTokenValid,(req,res,next)=>{
要检查令牌是否有效或过期(如果有效),请刷新令牌并将新令牌写入文件
关于这一点,唯一的问题是:write to file函数是在podcast路由连接到端点之后执行的,因此使用旧的访问令牌
通过登录控制台,这些函数将在播客路由获取所有播客之前执行,writeAccessTokenToFile()函数除外
只是想知道,有没有更好的方法
var express = require('express');
var router = express.Router();
var app = express();
var path = require('path');
var fs = require('fs');
const request = require('request');
var refreshToken = '425153ed4ddb4aee5sjsjsfaeffc46ab9944aece0400f';
var clientId = 'myId';
var client_secret = 'secret';
var isAccessTokenValid;
var access_token_file = path.join(__dirname, 'access_token.txt');
function refreshAccessToken() {
console.log('refreshAccessToken')
var body = { 'grant_type': 'refresh_token', 'refresh_token': refreshToken }
var options = {
url: `https://api.podbean.com/v1/oauth/token`,
headers: { 'Authorization': 'Basic ' + new Buffer(clientId + ":" + client_secret).toString('base64') },
json: body
}
request.post(options, (err, response, body) => {
// console.log(body.expires_in*1000)
if (err) {
return response.status(500).json({
title: 'An error has occured',
error: err
})
}
console.log(body)
writeAccessTokenToFile(body.access_token);
})
}
function getAccessToken() {
return fs.readFileSync(access_token_file, 'utf8');
}
function writeAccessTokenToFile(token) {
console.log('writeAccessTokenToFile = '+ token)
var data = getAccessToken();
var result = data.replace(data, token);
fs.writeFileSync(access_token_file, result, 'utf8');
}
function checkIfTokenValid (req, res, next) {
console.log('checkIfTokenValid')
var options = {
url: `https://api.podbean.com/v1/oauth/debugToken?access_token=${getAccessToken()}`,
headers: { 'Authorization': 'Basic ' + new Buffer(clientId + ":" + client_secret).toString('base64') }
}
request(options, (err, response, body) => {
if (err) {
return res.status(500).json({
title: 'An error has occured',
error: err
})
}
// console.log(JSON.parse(body))
isAccessTokenValid = JSON.parse(body).is_valid;
if (isAccessTokenValid) {
refreshAccessToken();
}
next();
})
};
router.get('/podcasts', checkIfTokenValid, (req, res, next) => {
var options = {
url: `https://api.podbean.com/v1/podcasts?access_token=${getAccessToken()}`
}
request(options, (err, response, body) => {
if (err) {
return res.status(500).json({
title: 'An error has occured',
error: err
})
}
res.json(JSON.parse(body));
next();
})
});
module.exports = router;
我不确定我是否会在服务器端缓存令牌。获取令牌是在客户端和身份验证服务之间完成的。确保令牌有效是服务器应该做的事情……但是客户端会在每个请求中发送令牌。我真的觉得这一切都可以在服务器端处理,因为没有日志,所以不需要客户端要发送到服务器,我希望访问令牌自动地发送到refesh,而不是锁定用户