express-jwt 无法从路由目录访问 req.user

Posted

技术标签:

【中文标题】express-jwt 无法从路由目录访问 req.user【英文标题】:express-jwt can't access req.user from routes directory 【发布时间】:2016-06-22 00:22:47 【问题描述】:

新表达...

当我处理 app.js 文件中的请求时,我可以访问 req.user。但是,我在路由文件夹中定义的路由(特别是 routes/users.js)没有 req.user,即使我在 app.js(app.use('/users', authenticate); 中对它们进行了身份验证。正如我所提到的,我是新来表达的,所以我可能配置不正确。非常感谢任何提示!如果不清楚或者您需要更多信息,请告诉我。谢谢!

app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var dotenv = require('dotenv');
var jwt = require('express-jwt');
var cors = require('cors');
var http = require('http');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();
var router = express.Router();

dotenv.load();

var authenticate = jwt(
  secret: new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'),
  audience: process.env.AUTH0_CLIENT_ID
);

app.use(cors());
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( extended: false ));
app.use(cookieParser());


app.use('/', routes);
app.use('/users', users);
app.use('/users', authenticate);
app.use('/secured', authenticate);


app.get('/ping', function(req, res) 
  res.send("All good. You don't need to be authenticated to call this");
);


app.get('/secured/ping', function(req, res) 
  // req.user works here!
  res.status(200).send("All good. You only get this message if you're authenticated");
);

var port = process.env.PORT || 3001;

http.createServer(app).listen(port, function (err) 
  console.log('listening in http://localhost:' + port);
);

module.exports = app;

路由/users.js

var models  = require('../models');
var express = require('express');
var router  = express.Router();

router.post('/', function(req, res) 
  // req.user = undefined
  console.log("user: " + req.user.sub)
  models.User.findOrCreate(
    where: tokenId: req.user.sub,
    defaults: 
      name: req.body.name,
      tokenId: req.user.sub,
      points: 0
    
  ).then(function(user) 
    res.json(JSON.stringify(user));
  );
);

module.exports = router;

【问题讨论】:

尝试将顺序改为app.use('/users', authenticate);app.use('/users', users); 【参考方案1】:

我认为问题在于 app.js

中以下代码的顺序
//some code
app.use('/users', users);
app.use('/users', authenticate);
//some code

Nodejs 以顺序方式工作。因此,它会先读取 routes/users.js 中的用户路由,然后再进行身份验证功能。这样,之后会调用未定义的req.user作为验证函数。

如果你尝试在app.use('/users', authenticate) 之后访问req.user,它不会是未定义的(express-jwt 可以正常工作)。

现在,如果您将代码更改为

//some code
app.use('/users', authenticate);
app.use('/users', users);
//some code

然后,它将对用户进行身份验证并将用户对象放入req.user,之后就可以访问了。

希望它对你有用。如果有任何问题,请告诉我。

【讨论】:

感谢您的建议...当我切换这些行时,我得到UnauthorizedError: No authorization token was found。还有其他建议吗?谢谢! 可能对你有帮助***.com/questions/31496439/… 原来我的请求没有正确设置授权标头。修复该问题并进行此更改后,它就可以工作了!谢谢!

以上是关于express-jwt 无法从路由目录访问 req.user的主要内容,如果未能解决你的问题,请参考以下文章

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

express-jwt 将用户对象设置为 req.user._doc 而不仅仅是 req.user?

与黑名单撤销功能一起使用时,Express-jwt 未设置 req.user

Passport.js、会话和反应 |从 /login 路由以外的任何路由访问 req.user 是未定义的

路由前的 Express-jwt 控制令牌

express-jwt 通过路由处理特定的秘密密码