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

Posted

技术标签:

【中文标题】如何使用 JWT 和 Passport 正确使用 nodeJs API 的身份验证?【英文标题】:How to correctly use the authentication for nodeJs API using JWT and Passport? 【发布时间】:2017-10-25 21:03:40 【问题描述】:

我正在使用 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.eyJuYW1lIjoiYXR1bCIsImVtYWlsIjoidHJlZUB0cmVlLmNvbSIsInBob25lIjpudWxsLCJwYXNzZHJlc3MiOm51bGwsImNvdW50cnkiOm51bGwsInN0YXRlIjpudWxsLCJwaW5jb2RlIjpudWxsLCJvcmdfaWQiOjAsInJvbGVzIjpudWxsLCJjcmVhdGVfZGF0ZSI6IjIwMTctMDUtMThUMTk6NTE6MDYuMDAwWiIsImxhc3RfbG9naW4iOiIyMDE3LTA1LTE4VDE5OjUxOjA2LjAwMFoiLCJhdmF0YXJfdXJsIjpudWxsfQ.umxBRd2sazaADSDOW0e8rO5mKDpQYIK1hsaQMZriZFE

application/json

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

但是在客户端我可以使用 jwt-decode 获取令牌检索,而无需在客户端使用任何秘密,如果令牌被中间人捕获怎么办,如何增强安全性? 在我的节点 api 路由中正确使用 JWT 是否缺少一些东西?

有些地方我看到 Authorisation 被传递为bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiYXR1bCIsImVtYWlsIjoidHJlZUB0cmVlLmNvbSIsInBob25lIjpudWxsLCJwYXNzd29yZCI6IiQyYSQxMCRIQVJPTy5PUEdYWFBvVktXOVhmYnZldk 当我尝试使用承载时,我在验证后获取信息时出错。 这个承载和 JWT 的值是什么?

我正在使用护照-jwt var JwtStrategy = require('passport-jwt').Strategy;

【问题讨论】:

【参考方案1】:

要使用 JWT 令牌,您必须使用 SSL (https)。没有它,您将根本得不到保护。

JWT 令牌已签名(检查 site)。所以如果有人(中间人)试图改变它,它就会失效。

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

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

见:

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

希望它清楚。

【讨论】:

以上是关于如何使用 JWT 和 Passport 正确使用 nodeJs API 的身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

Passport 策略如何知道在 nestJS 中选择正确的 jwt 策略?

使用 passport-jwt 验证节点 API

Passport-jwt 不同的令牌相同的结果

如何使用 passport-jwt 验证路由?

如何在没有会话的情况下整合passport-facebook和jwt?

Passport & JWT & Google/Facebook 策略 - 如何结合 JWT 和 Google/Facebook 策略?