簡體   English   中英

Express JS授權中間件

[英]Express JS authorization middleware

我正在使用Express JS編寫API,該API使用JSON Web令牌進行授權。 是否有更易讀的方式向用戶顯示正確的錯誤消息? 您將如何重構以下授權中間件?

 module.exports.authorize = function (request, response, next) { var apiToken = request.headers['x-api-token']; if(apiToken) { var decoded = token.verify(apiToken); if(decoded) { if(decoded.exp <= moment().format('x')) { next(); } else { var expiredTokenError = new Error('Token has expired'); expiredTokenError.status = 419; return next(expiredTokenError); } } else { var invalidTokenError = new Error('Token is invalid'); invalidTokenError.status = 401; return next(invalidTokenError); } } else { var notFoundError = new Error('Token not found'); notFoundError.status = 404; return next(notFoundError); } }; 

為了提高可讀性,我建議首先處理所有錯誤,然后在一切正常的情況下立即致電下一步。 另外,您可能希望將錯誤處理移至單獨的函數,以避免重復自己的操作。 簡而言之:

var ERRORS = {
  EXPIRED: {
    message: 'Token has expired',
    status: 419
  },
  NOT_FOUND: {
    message: 'Token not found',
    status: 404
  },
  INVALID: {
    message: 'Token is invalid',
    status: 401
  }
}

var errorHandler = function(err,next) {
  var error = new Error(err.message);
  error.status = err.status;
  next(error);
};

module.exports.authorize = function (request, response, next) {
  var apiToken = request.headers['x-api-token'];

  if(!apiToken){
    return errorHandler(ERRORS.NOT_FOUND,next);
  }

  var decoded = token.verify(apiToken);

  if(!decoded){
    return errorHandler(ERRORS.INVALID,next);
  }

  if(decoded.exp > moment().format('x')){
    return errorHandler(ERRORS.EXPIRED,next);
  }

  next();
};

我會避免在return語句后使用else

module.exports.authorize = function (request, response, next) {
    var apiToken = request.headers['x-api-token'];

    if (!apiToken) {
        var notFoundError = new Error('Token not found');
        notFoundError.status = 404;
        return next(notFoundError);
    }

    var decoded = token.verify(apiToken);

    if (!decoded) {
        var invalidTokenError = new Error('Token is invalid');
        invalidTokenError.status = 401;
        return next(invalidTokenError);
    }

    if (decoded.exp > moment().format('x')) {
        var expiredTokenError = new Error('Token has expired');
        expiredTokenError.status = 419;
        return next(expiredTokenError);
    }

    next();
};

我知道這是JavaScript,但是從概念上講,Programmers.SE上的這個問題可能會讓您感興趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM