2017-08-29 129 views
0

我使用express-jwt設置基於令牌的身份驗證,但如果令牌丟失或無效,發送錯誤消息的中間不起作用。express jwt - 身份驗證中間件問題

index.js文件

const express = require('express'); 
const router = express.Router(); 
const {getAllUsers: findUser} = require('../controllers/users'); 
const {register: registerUser, login: loginUser} = require('../controllers/authentication'); 
const jwt = require('express-jwt'); 
const auth = jwt({ 
secret: process.env.JWT_SECRET, 
userProperty: 'auth' 
}); 
// users 
router 
.route('/users', auth) 
.get(findUser); 

// registration 
router 
.route('/register') 
.post(registerUser); 

// login 
router 
.route('/login',auth) 
.post(loginUser); 

module.exports = router; 

用戶控制器:

const mongoose = require('mongoose'); 
const User = mongoose.model('Users'); 

let getAllUsers = (req,res) => { 

User.find((err,user)=>{ 
    if(user){ 
     res 
      .status(200) 
      .json({user}) 
    } 
    }); 
}; 

module.exports = { 
    getAllUsers 
}; 

app.js文件:

require('dotenv').load(); 
const express = require('express'); 
const path = require('path'); 
const favicon = require('serve-favicon'); 
const logger = require('morgan'); 
const cookieParser = require('cookie-parser'); 
const bodyParser = require('body-parser'); 
const passport = require('passport'); 

require('./app_api/models/db'); 
require('./app_api/config/passport'); 

const index = require('./app_server/routes/index'); 
const apiRoutes = require('./app_api/routes/index'); 


const app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'app_server','views')); 
app.set('view engine', 'ejs'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 


    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded({ extended: false })); 
    app.use(cookieParser()); 
    app.use(express.static(path.join(__dirname, 'public'))); 



app.use(passport.initialize()); 

    app.use('/', index); 
    app.use('/api', apiRoutes); 

    //error handlers 
    // catch unauthorised errors 
    app.use(function (err, req, res, next) { 
    if (err.name === 'UnauthorizedError') { 
     res.status(401).send('invalid token...'); 
    } 
}); 
// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    const err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 
}); 


module.exports = app; 

林setti返回所有用戶列表的users路由中間件。但只有授權用戶才能訪問該列表。

中間件似乎沒有工作,因爲我仍然可以獲取用戶列表,即使我不發送令牌。 我在做什麼錯?

請注意:我使用POSTMAN來測試這個。


更新(想通了這個問題):

這是一個非常簡單的解決不能相信我沒有看到過它。問題是我在哪裏放置auth

我將它放在route網址後,像這樣:

router 
.route('/users', auth) 
.get(findUser); 

當這樣做的正確的方法是:

router 
.route('/users') 
.get(auth, findUser); 

上述固定我的問題。

回答

0

根據知識庫中的README,您應該檢查user屬性是否存在於請求中。

JWT認證中間件使用JWT驗證呼叫者。 如果令牌有效,req.user將被設置爲解碼的JSON對象 供後面的中間件用於授權和訪問 控制。

findUser功能應當予以受理

function findUser(req, res) { 
    if (!req.user) return res.sendStatus(401); 
    // do something else 
} 

您也可以考慮更改userPropertyrequestProperty

+0

感謝您的回答。錯誤處理不應該由中間件完成嗎?那是我的主要問題中間件不起作用。我應該得到一個'無效的令牌....'的錯誤信息,但我不是。 – Skywalker

+0

你能告訴你如何在你的應用中實現這條路由嗎?你提供的東西看起來不完整。這可能是路由配置的問題。 –

+0

請參閱我更新的問題。我添加了我的'app.js'文件,'index.js'文件和控制器文件。我希望這有幫助。 – Skywalker