Обновить токен экспресс JS - PullRequest
       4

Обновить токен экспресс JS

1 голос
/ 24 сентября 2019

У меня есть экспресс-сервер, который получает список подкастов с конечной точки.

Это отлично работает, но есть токен, который я использую в запросах для авторизации входа на конечные точки.

ответ при получении токена доступа выглядит следующим образом:

{ access_token: '8c9d31761cbd32da25f1f1b988b527cde01c9d8a',
  expires_in: 604800,
  token_type: 'Bearer',
  scope: 'podcast_read episode_read podcast_update episode_publish' }

У меня есть токен обновления, который я использую при обновлении токена, и он работает хорошо.

То, как я делаюна данный момент, у меня есть текстовый файл, который содержит токен, приложение читает из этого при выполнении запроса, я настроил функцию, которая вызывается каждый раз, когда маршрут подкастов называется router.get('/podcasts', checkIfTokenValid, (req, res, next) => {, чтобы проверить, еслитокен действителен или срок его действия истек, обновите токен и запишите новый токен в файл.

Единственное, что с этим связано;функция записи в файл выполняется после подключения маршрута подкастов к конечной точке, поэтому используется старый токен доступа.

При входе в консоль функции выполняются до того, как маршрут подкастов получает все подкасты, кромефункция 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...