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

标签 javascript node.js express auth0 express-jwt

新表达...

当我在 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;

路由/user.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.js 中以下代码的顺序

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

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

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

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

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

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

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

关于javascript - express-jwt 无法从路由目录访问 req.user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35860894/

相关文章:

javascript - 带数组的 HTML 5 本地存储

node.js - Azure存储NodeJS修改默认超时设置

javascript - 如何处理编码的base64音频并重新发送到谷歌?

javascript - 将 mustache.js 部分与 express 结合使用

javascript - 当用javascript推送对象时如何打开一个div并关闭另一个div?

javascript - 如何通过 Angular 中的嵌套指令向下传递包含?

javascript - 为什么我的公共(public)文件夹中的文件得到 404

javascript - 如何在 Express 4.0 中发送 Flash 消息?

javascript - 如何在 Pug 中定义内联变量

javascript - 发布 npm 包后 ENOLOCAL : can't find package. json 文件