2016-04-27 24 views
7

Tôi đang sử dụng Express để yêu cầu proxy tới một máy chủ API riêng biệt được mã thông báo truy cập OAuth 2 bảo vệ. Khi mã thông báo hết hạn, máy chủ sẽ trả lại 401 mà tôi hiện đang xử lý trong phần trung gian của bộ định tuyến để sau đó chuyển và làm mới mã thông báo truy cập được liên kết với phiên khách hàng (Tôi đang sử dụng express-session).Gọi lại yêu cầu tương tự trong nút nhanh

Đây là mã của tôi:

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

Sau khi cập nhật được dấu hiệu, tôi muốn cấp lại theo yêu cầu API gốc mà tôi đang kích hoạt bằng cách sử dụng mô-đun request trong lấy điều khiển của tôi.

Tôi hơi bối rối về cách tôi thực sự thực hiện việc này, có cách nào thanh lịch để đạt được điều này không?

Trả lời

0

Tôi sẽ biến bộ điều khiển auth từ phần mềm trung gian thành lời hứa. Sau đó tạo fetch đệ quy.

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; 
}; 
Các vấn đề liên quan