Javascript 刷新访问令牌express js

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' } 我有一个

我有一个express服务器,可以从端点获取播客列表

这很好,但是我在请求中使用了一个令牌来授权进入端点

获取访问令牌时的响应如下所示:

{ 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,而不是锁定用户