Node js jwt - 验证中间件不能用于我的安全路由

时间:2017-08-21 17:30:54

标签: node.js express mongoose jwt

我是节点js的一个小后端开发人员。目前,我正在创建一个应用程序来提高我的节点js的技能水平。所以我想我会尝试为用户身份验证部分学习JSON webtoken(jwt)。我正在使用this link来了解它是如何工作的。但是现在我遇到了一个问题,我必须更改然后修复它与教程不同。教程为您提供的中间件不适用于安全路由。那么让我来描述代码运行时会发生什么。如果我们没有向中间件检查的任何路由提供任何令牌,那么路由器就像我们期望的那样工作,而不会从中间件返回任何错误。所以,请让我知道一个解决方案,以最简单的方式解决这个问题。谢谢。

api的安全路线文件

//Node js libraries
const express       =           require('express');
const router        =           express.Router();
const app           =           express();
const jwt           =           require('jsonwebtoken');

//Static files
const Users         =           require('../models/users');

app.set('superSecret', 'thisissecretkeyforapi');

//Routes here
router.post('/', function(req, res){
    if(req.body.username == '' || req.body.password == '') {
        res.send('Fields must be required');
    }
    else {
        Users
        .findOne({
            username: req.body.username
        },
        function(err, user){
            if(!user){
                res.send('No user found');
            }
            else {
                if(user.password != req.body.password) {
                    res.send('Wrong password');
                }
                else {
                    var token = jwt.sign(user, app.get('superSecret'), {
                        expiresIn: 60*15
                    });
                    res.send({
                        message: "Token here",
                        token: token
                    })
                }
            }
        });
    }
})

router.get('/profile', function(req, res){
    console.log(req.decoded);
    res.send('profile here');
});

module.exports = router;

所有中间件的app.js文件

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var morgan = require('morgan');
var mongoose = require('mongoose');

mongoose.Promise = global.Promise;
mongoose.connect('mongodb://cordy:lolla123@ds042459.mlab.com:42459/musiclk', {
    useMongoClient: true
});

app.set("view engine", "ejs");
app.set('superSecret', 'thisissecretkeyforapi');

app.use(morgan('dev'));

app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

require('./controllers/index')(app);

app.set('superSecret', 'thisissecretkeyforapi');

admin_routes = require('./controllers/admin_routes');

admin_routes.use(function(req, res, next) {
    // check header or url parameters or post parameters for token
    var token = req.body.token || req.query.token || req.headers['x-access-token'];
    // decode token
    if (token) {
        // verifies secret and checks exp
        jwt.verify(token, app.get('superSecret'), function(err, decoded) {      
            if (err) {
                return res.json({
                    success: false,
                    message: 'Failed to authenticate token. The token is expired' });    
            }
            else {
                // if everything is good, save to request for use in other routes
                req.decoded = decoded;    
                next();
            }
        });
    } else {
        // if there is no to
        // return an error
        return res.status(403).send({ 
            success: false, 
            message: 'No token provided.' 
        });
    }
});

app.use('/admin', admin_routes);

app.listen(process.env.PORT || 1337, function(){
    console.log("Now listening for the requests");
});

我的所有代码都已存在。

0 个答案:

没有答案