2016-03-08 56 views
0

新來表達訪問req.user ...快遞,智威湯遜無法從路由目錄

我可以訪問req.user,當我處理我app.js文件中請求。但是,我在我的路由文件夾(特別是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; 
+0

嘗試將訂單更改爲'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,它不會是未定義(表達-JWT工作正常)。

現在,如果你的代碼更改爲

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

然後,它會驗證用戶,並把用戶對象req.user和可訪問之後。

希望它適合你。讓我知道,如果有任何問題。

+0

感謝您的建議......當我切換這些行時'未經授權的錯誤:未找到授權令牌。還有其他建議嗎?謝謝! – Cole

+0

它可能會幫助你http://stackoverflow.com/questions/31496439/express-jwt-not-respecting-unprotected-paths –

+0

結果我的請求沒有正確設置授權標題。解決這個問題並進行修改後,它就可以工作!謝謝! – Cole