2016-04-27 37 views
7

OAuth 2 erişim belirticileri tarafından korunan ayrı bir API sunucusuna Proxy istekleri için Express kullanıyorum. Bir jetonun süresi dolduğunda, sunucu artık benim yönlendirici ara yazılımımda işleme koyduğum bir 401'i döndürecek ve daha sonra istemci oturumuyla ilişkili erişim belirtecini yenileyecek (express-session kullanıyorum). İşte Düğüm içinde aynı isteği tekrar arayın

benim kodudur:

router.js

app.use('/api', require('./routes.js'));

routes.js

var express = require('express'), 
    router = express.Router(), 
    routesController = require('./routes.controller.js'); 

router.route('/*') 
    .get(routesController.fetch); 

routes.controller.js

authController

module.exports.refreshToken = function(req, res, next) { 
    var formData = { 
     grant_type: 'refresh_token', 
     refresh_token: req.session.refreshToken, 
     scope: 'PRODUCTION' 
    }, 
    headers = { 
     'Authorization' : 'Basic ' + consts.CLIENT_KEY_SECRET_BASE64_DEV 
    }; 
    request.post({url:consts.ACCESS_TOKEN_REQUEST_URL_DEV, form:formData, headers: headers, rejectUnauthorized: false}, function(err, response, body){ 
    var responseBody = JSON.parse(body); 
    if (response.statusCode === 200) { 

     req.session.accessToken = responseBody.access_token; 
     req.session.refreshToken = responseBody.refresh_token; 
     next(); 
     //How to recall the original request made from fetch controller function after this point? 
    } else { 
     console.log('SOMETHING ELSE HAPPENED!'); 
    } 
    }); 
}; 

module.exports.fetch = function(req, res, next) { 
    var options = helpers.buildAPIRequestOptions(req); 
    request(options, function(err, response, body){ 
    if(response.statusCode === 401) { 
     authController.refreshToken(req, res, next); 
    } else { 
     res.status(response.statusCode).send(body); 
    } 
    }); 
}; 

belirteci güncelledikten sonra benim getirme denetleyicisi request modülü kullanarak tetikleme am orijinal API isteği yeniden yapılmasını istiyoruz.

Bunu yapmak için gerçekten uğraştığım için biraz şaşırdım, bunu başarmanın zarif bir yolu var mı?

cevap

0

Auth denetleyicisini orta yazılımdan bir söz vericiye dönüştürürüm. Sonra fetch özyinelemeyi yapın.

routes.controller.js

module.exports.fetch = fetch; 

function fetch(req, res, next) { 
    var options = getSavedOptsFromRequest(req) || helpers.buildAPIRequestOptions(req); 
    request(options, function(err, response, body){ 
    if(response.statusCode === 401) { 
     saveOptsToRequest(req, options) 
     authController.refreshToken(req) 
     .then(function authOk(){ 
      fetch(req, res, next); 
     }) 
     .catch(function authKo(){ 
      res.status(500).send('something'); 
     }); 
    } else { 
     res.status(response.statusCode).send(body); 
    } 
    }); 
}; 

function saveOptsToRequest(req, options){ 
    req.requestedOptions = options; 
} 

function getSavedOptsFromRequest(req){ 
    return req.requestedOptions; 
} 

authController

module.exports.refreshToken = function(req) { 
    var refreshTokenPromise = new Promise(function (resolve, reject){ 
     var formData = { 
      grant_type: 'refresh_token', 
      refresh_token: req.session.refreshToken, 
      scope: 'PRODUCTION' 
      }, 
      headers = { 
      'Authorization' : 'Basic ' + consts.CLIENT_KEY_SECRET_BASE64_DEV 
      }; 
     request.post({url:consts.ACCESS_TOKEN_REQUEST_URL_DEV, form:formData, headers: headers, rejectUnauthorized: false}, function(err, response, body){ 
      var responseBody = JSON.parse(body); 
      if (response.statusCode === 200) { 

      req.session.accessToken = responseBody.access_token; 
      req.session.refreshToken = responseBody.refresh_token; 
      resolve(); 
      //How to recall the original request made from fetch controller function after this point? 
      } else { 
      console.log('SOMETHING ELSE HAPPENED!'); 
      reject(new Error("Something!!!!")); 
      } 
     }); 
    }); 
    return refreshTokenPromise; 
};