2016-04-27 25 views
7

में एक ही अनुरोध को फिर से कॉल करना मैं ओएथ 2 एक्सेस टोकन द्वारा संरक्षित एक अलग API सर्वर पर प्रॉक्सी अनुरोधों के लिए एक्सप्रेस का उपयोग कर रहा हूं। जब टोकन समाप्त हो जाता है, तो सर्वर अब 401 लौटाएगा जो अब मैं अपने राउटर मिडलवेयर में संभालने के लिए क्लाइंट सत्र से जुड़े एक्सेस टोकन को रीफ्रेश कर सकता हूं (मैं express-session का उपयोग कर रहा हूं)।नोड एक्सप्रेस

यहाँ मेरी कोड है:

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

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); 
    } 
    }); 
}; 

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!'); 
    } 
    }); 
}; 

टोकन अद्यतन करने के बाद, मैं दोबारा जारी करने के मूल एपीआई अनुरोध है कि मैं अपने लाने नियंत्रक में request मॉड्यूल का उपयोग कर ट्रिगर कर रहा हूँ चाहते हैं।

मैं थोड़ा सा स्टंप हूं कि मैं वास्तव में ऐसा करने के बारे में कैसे जाता हूं, क्या यह हासिल करने का एक शानदार तरीका है?

उत्तर

0

मैं ऑथ कंट्रोलर को मिडलवेयर से वादे में बदल दूंगा। फिर fetch रिकर्सिव बनाएं।

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; 
}; 
संबंधित मुद्दे