express-jwt 不尊重不受保护的路径
Posted
技术标签:
【中文标题】express-jwt 不尊重不受保护的路径【英文标题】:express-jwt Not respecting unprotected paths 【发布时间】:2015-10-08 09:24:07 【问题描述】:关于 express-jwt 模块的信息可以在这里找到:
https://github.com/auth0/express-jwt https://www.npmjs.com/package/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);
但这没有用。我也尝试将正则表达式用于除非路径,但这也不起作用。
我通过this answer 到达app.all('/apiv1', token...)
,但该解决方案无法为我提供所需的功能。
【问题讨论】:
【参考方案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);
);
);
【讨论】:
我遇到了类似的问题,这一行似乎解决了它: app.use(function(err, req, res, next) res.status(err.status || 500).send (呃); );在我开始使用它之前,我在每条路由的控制台中都得到了相同的“UnauthorizedError”。现在,如果我访问不受保护的路线,我只会收到错误。这个魔法做了什么来解决它?以上是关于express-jwt 不尊重不受保护的路径的主要内容,如果未能解决你的问题,请参考以下文章
在 Node.js 中使用 express-jwt 令牌保护非 api (res.render) 路由
apple-app-site-association 应用程序顺序不受尊重
express-jwt 和 express-graphql:错误 TS2339:“请求”类型上不存在属性“用户”