2013-02-25 4 views
0

У меня есть приложение Node.js, построенное с помощью рамки Express.js. Я хочу проверить, что пользователь имеет право выполнять определенный запрос, я делаю это, требуя от клиентов предоставить токен доступа в заголовке. Я не хочу добавлять это к каждой из отдельных функций, к которым имеют доступ клиенты. Например, для информационного запроса о пользователе:Проверка заголовков на верхнем уровне

exports.info = function(req, res) { 
    var userId = req.params.id, 
     accessToken = req.headers["accesstoken"]; 
    console.log("received request to get info for userID <"+ userId +">"); 
    users.User.findOne({accessToken: accessToken}, function(err, user) { 
     if(user == null) { 
     ... 

Как это сделать на более высоком уровне? Могу ли я установить это требование заголовка где-нибудь на глобальном языке для выражения? Я хочу сделать это в основном для всех функций, кроме функции входа в систему, поэтому все функции, кроме одного.

ответ

1

Вы можете сделать небольшое промежуточное программное обеспечение:

verifyUser = function(req,res,next){ 
    var userId = req.params.id, accessToken = req.headers["accesstoken"]; 
    console.log("received request to get info for userID <"+ userId +">"); 
    users.User.findOne({accessToken: accessToken}, function(err, user) { 
    if(user == null) { 
     ... 
    } 

    next() 
    } 
} 

Тогда:

На одном запросе :

app.get("/user/info", verifyUser, exports.info) 

На выбор запросов:

app.all(SomeRegex, verifyUser) 

На всех resquests:

app.use(verifyUser) 
0

Просто добавьте свою функцию как еще одно из простого промежуточного программного обеспечения, которое выполняется до обработки вашего запроса.

app.use(function(req, res, next) { 
    var userId = req.params.id, 
     accessToken = req.headers["accesstoken"]; 
    console.log("received request to get info for userID <"+ userId +">"); 
    users.User.findOne({accessToken: accessToken}, function(err, user) { 
     if(user != null) { 
      return next(); // This is ok, keep processing 
     } else { 
      // don't call next, redirect to login page, etc... 
     } 
} 

app.get('/home', ...); 
apg.get('/some_other_page'); 

Вы звоните рядом, чтобы получить экспресс-обработки, как обычно, или вы используете перенаправление или возвращает ошибку и не называйте рядом.

0

Вы можете создать промежуточное программное обеспечение и настроить его на каждом маршруте, вам необходимо авторизовать. Пример:

var myAuthMiddleware = function (req, res, next) { 

    // Here goes your code to check if the user complies 
    // with the conditions. You can use req.headers, req.user, etc 

    if (conditionIsMet) return next(); // If the user complies, you continue the process 

    // The user doesn't comply 
    return res.send('Error'); 
} 

Затем вы используете его промежуточное программное обеспечение в необходимых маршрутах:

app.get('/my-route', myAuthMiddleware, myRouteHandler); 
app.post('/another-route', myAuthMiddleware, myOtherRouteHandler); 
// This one doesn't need auth 
app.get('/', indexHandler); 
Смежные вопросы