express-jwt 不尊重不受保护的路径
express-jwt Not respecting unprotected paths
关于 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
创建新用户 and/or 通过 apiv1/auth/login
.
登录
然而,每当我尝试向上述不受保护的路径发出请求时,我都会收到错误消息:
UnauthorizedError: No authorization token was found
它还在保护我指定不保护的路由!我也试过:
app.use('/apiv1/user', token.unless({ path: ['/apiv1/user/create'] }), user);
app.use('/apiv1/auth', token.unless({ path: ['/apiv1/auth/login'] }), auth);
但这没有用。我还尝试对 unless 路径使用正则表达式,但这也不起作用。
我通过 到达了 app.all('/apiv1', token...)
,但是那个解决方案并没有给我想要的功能。
而不是使用 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);
});
});
关于 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
创建新用户 and/or 通过 apiv1/auth/login
.
然而,每当我尝试向上述不受保护的路径发出请求时,我都会收到错误消息:
UnauthorizedError: No authorization token was found
它还在保护我指定不保护的路由!我也试过:
app.use('/apiv1/user', token.unless({ path: ['/apiv1/user/create'] }), user);
app.use('/apiv1/auth', token.unless({ path: ['/apiv1/auth/login'] }), auth);
但这没有用。我还尝试对 unless 路径使用正则表达式,但这也不起作用。
我通过 app.all('/apiv1', token...)
,但是那个解决方案并没有给我想要的功能。
而不是使用 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);
});
});