express-jwt Несоблюдение незащищенных путей

Информацию о модуле express-jwt можно найти здесь:

В моем файле сервера main.js у меня есть следующее:

import ExpressJwt from 'express-jwt';
// import other crap...

let token = ExpressJwt({
    secret: 'whatever',
    audience: 'whatever',
    issuer: 'whatever'
});

app.all('/apiv1', token.unless({ path: ['apiv1/user/create', '/apiv1/auth/login']}));

app.use('/apiv1/user', user);
app.use('/apiv1/auth', auth);

Где user и auth — промежуточные программы, которые обрабатывают мои маршруты. То, что я хочу сделать, очевидно; запретить доступ к API всем неаутентифицированным пользователям, за исключением случаев, когда они пытаются создать нового пользователя через apiv1/user/create и/или войти через apiv1/auth/login.

Однако каждый раз, когда я пытаюсь сделать запрос к вышеупомянутым незащищенным путям, я получаю сообщение об ошибке:

UnauthorizedError: Токен авторизации не найден

Он по-прежнему защищает маршруты, которые я указал как незащищенные! Я также пробовал:

app.use('/apiv1/user', token.unless({ path: ['/apiv1/user/create'] }), user);
app.use('/apiv1/auth', token.unless({ path: ['/apiv1/auth/login'] }), auth);

Но это не сработало. Я также пытался использовать регулярное выражение для путей, кроме тех, но это тоже не сработало.

Я пришел к app.all('/apiv1', token...) через этот ответ, но это решение работает не дают мне желаемой функциональности.


person Kenny Worden    schedule 18.07.2015    source источник


Ответы (1)


Вместо использования all:

app.all('/apiv1', token.unless({ path: ['apiv1/user/create', '/apiv1/auth/login']}));

Попробуйте использовать use и добавить в маршрут пути косую черту / в начале:

app.use('/apiv1', token.unless({ path: ['/apiv1/user/create', '/apiv1/auth/login']}));

Вот пример, который работает:

app.js:

var express = require('express');
var app = express();

var expressJwt = require('express-jwt');
var jwt = require('jsonwebtoken');
var secret = 'secret';

app.use('/api', expressJwt({secret: secret}).unless({path: ['/api/token']}));

app.get('/api/token', function(req, res) {
  var token = jwt.sign({foo: 'bar'}, secret);
  res.send({token: token});
});

app.get('/api/protected', function(req, res) {
  res.send('hello from /api/protected route.');
});

app.use(function(err, req, res, next) {
  res.status(err.status || 500).send(err);
});

app.listen(4040, function() {
  console.log('server up and running at 4040 port');
});

module.exports = app;

test.js:

var request = require('supertest');
var app = require('./app.js');

describe('Test API', function() {
  var token = '';

  before(function(done) {
    request(app)
      .get('/api/token')
      .end(function(err, response) {
        if (err) { return done(err); }
        var result = JSON.parse(response.text);
        token = result.token;
        done();
      });
  });

  it('should not be able to consume /api/protected since no token was sent', function(done) {
    request(app)
      .get('/api/protected')
      .expect(401, done);
  });

  it('should be able to consume /api/protected since token was sent', function(done) {
    request(app)
      .get('/api/protected')
      .set('Authorization', 'Bearer ' + token)
      .expect(200, done);
  });
});
person Wilson    schedule 19.07.2015
comment
У меня была похожая проблема, и эта строка, похоже, решила ее: app.use(function(err, req, res, next) { res.status(err.status || 500).send(err); }); Я получал одну и ту же UnauthorizedError в консоли для КАЖДОГО маршрута, прежде чем начал использовать это. Теперь я получаю ошибки только при доступе к незащищенным маршрутам. Что эта магия сделала, чтобы решить эту проблему? - person Ska; 24.01.2017