[英]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();
};
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.