如何使用JWT和Passport正确使用nodeJs API的身份验证?

时间:2017-05-25 09:12:43

标签: node.js rest authentication jwt passport.js

我正在使用JWT-simple来验证我的快速路线。

服务器端:

var jwt = require('jwt-simple');
var bcrypt = require('bcrypt');
var passport = require('passport');

require('../passport')(passport);

/* Create an Account */
router.post('/signup', function (req, res, next) {
    var verifyCode = Math.random().toString(36).slice(-8);
    var userData =  {
        name: req.body.name,
        email: req.body.email,
        phone: req.body.contact,
        password: req.body.password,
        verify_code: verifyCode,
        status: 0
    };

   loginService.createUser(userData, function (err, data) {
            if (err) {
                res.status(500).json({error: true, data: {message: err.message}});
            } else {
                var token = jwt.encode(data, "secret");
                res.json({success: true, data: {token: 'JWT ' + token}});
            }
        });
});
/* GET the info of an API using the jwt token data */
router.get('/info', passport.authenticate('jwt', {session: false}), function (req, res, next) {
    var token = tokenRetrive.getToken(req.headers);
    if (token) {
        var decoded = jwt.decode(token, configVar.config.secret);
        UserService.getContentUserById(decoded.id, function (err, user) {
            if (err) {
                res.status(500).json({error: true, data: {message: err.message}});
            } else {
                if (!user) {
                    res.send({success: false, msg: 'Authentication failed. User not found.'});
                } else {
                    if (!user) {
                        return res.status(403).send({success: false, msg: 'Authentication failed. User not found.'});
                    } else {
                        res.json({success: true, data: user.toJSON()});
                    }
                }
            }
        });
    } else {
        return res.status(403).send({success: false, msg: 'No token provided.'});
    }
});

客户端

var signup = function(user) {
            return $q(function(resolve, reject) {
                $http.post(API_ENDPOINT.url + '/signup', user).then(function(result) {
                    if (result.data.success) {
                        storeUserCredentials(result.data.data.token);
                        resolve(result.data);
                    } else {
                        reject(result.data.msg);
                    }
                });
            });
        };

 function storeUserCredentials(token) {
            window.localStorage.setItem(TOKEN_KEY, token);
            var loggedIn_user_Data = jwt_decode(token);
            $http.defaults.headers.common.Authorization = token;
        }

当我将标题信息传递给API时,使用REST客户端(POSTMAN)我使用

API:localhost:8080 / info

Authorization
Content-Type   

JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiYXR1bCIsImVtYWlsIjoidHJlZUB0cmVlLmNvbSIsInBob25lIjpudWxsLCJwYXNzd29yZCI6IiQyYSQxMCRIQVJPTy5PUEdYWFBvVktXOVhmYnZldkJRWldRaXNJa2JpT09WZHlsNmZxMlF2aURPOExBYSIsInZlcmlmeV9jb2RlIjoiMHdkZWlwYjkiLCJzdGF0dXMiOiIiLCJpZCI6MTYsImFkZHJlc3MiOm51bGwsImNvdW50cnkiOm51bGwsInN0YXRlIjpudWxsLCJwaW5jb2RlIjpudWxsLCJvcmdfaWQiOjAsInJvbGVzIjpudWxsLCJjcmVhdGVfZGF0ZSI6IjIwMTctMDUtMThUMTk6NTE6MDYuMDAwWiIsImxhc3RfbG9naW4iOiIyMDE3LTA1LTE4VDE5OjUxOjA2LjAwMFoiLCJhdmF0YXJfdXJsIjpudWxsfQ.umxBRd2sazaADSDOW0e8rO5mKDpQYIK1hsaQMZriZFE

application/json

只有在传递了正确的令牌并且工作正常时,上述API才会提供数据。

然而在客户端我可以使用jwt-decode获取令牌检索,而不在客户端使用任何秘密,如果令牌被中间人抓住,如何增强安全性呢?
为了节点api路由,我是否缺少正确使用JWT的东西?

有些地方我看到授权作为bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiYXR1bCIsImVtYWlsIjoidHJlZUB0cmVlLmNvbSIsInBob25lIjpudWxsLCJwYXNzd29yZCI6IiQyYSQxMCRIQVJPTy5PUEdYWFBvVktXOVhmYnZldk传递 当我尝试使用承载时,我在获取身份验证后收到错误信息。 什么是持票人和JWT被传递给头部?

我使用的是passport-jwt     var JwtStrategy = require(' passport-jwt')。策略;

1 个答案:

答案 0 :(得分:1)

要使用JWT令牌,您必须使用SSL(https)。没有它,你根本就没有保护。

JWT令牌已签名(请查看site)。因此,如果某人(中间人)试图改变它,它将失效。

JWT和Bearer基本相同。它们只是auth scheme标题的authorization

' JWT' auth schemepassport-jwt的默认值。 如果要更改它,可以使用不同的jwtFromRequest值。

请参阅:

new Strategy({ ... jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('Bearer') ... }, verifyFunction)

希望清楚。