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);

userauth 是处理我的路由的中间件。我想做的很明显;拒绝所有未经身份验证的用户的 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:“请求”类型上不存在属性“用户”

XML 中按钮的换行符不受尊重,但它适用于 Java 代码

受保护路由的 jest.mock express-jwt 中间件行为

Matplotlib figsize不受尊重[重复]