【问题标题】:express-jwt Not respecting unprotected pathsexpress-jwt 不尊重不受保护的路径
【发布时间】:2015-10-08 09:24:07
【问题描述】:

关于 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...),但该解决方案无法为我提供所需的功能。

【问题讨论】:

    标签: node.js express jwt express-jwt


    【解决方案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”。现在,如果我访问不受保护的路线,我只会收到错误。这个魔法做了什么来解决它?
    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 2019-04-23
    • 2021-07-28
    • 2019-01-25
    • 2021-12-09
    • 2019-07-06
    • 2022-11-16
    • 2012-12-29
    相关资源
    最近更新 更多