2015-07-18 2 views
2

Информация о экспресс-JWT модуля можно найти здесь:экспресс-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: No authorization token was found

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

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...) через this answer, но это решение не дает мне желаемой функциональности.

ответ

3

Вместо использования 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); 
    }); 
}); 
+0

У меня была аналогичная проблема, и эта линия, кажется, решили ее: app.use (функция (ERR, REQ, Рез, следующий) { res.status (err.status || 500) Пошлите (ERR); }); Я получал тот же «UnauthorizedError» в консоли для КАЖДОГО маршрута, прежде чем я начал использовать это. Теперь я получаю ошибки только при доступе к незащищенным маршрутам. Что сделала эта магия для ее решения? – Ska

Смежные вопросы