2017-05-25 58 views
1

我正在使用JWT-simple驗證我的快遞路線。如何使用JWT和Passport正確使用nodeJs API的身份驗證?

服務器側:

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; 
     } 

使用REST客戶端(郵差)當我通過頭信息到API我使用

API :localhost:8080/info

重點

Authorization 
Content-Type 

價值

JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiYXR1bCIsImVtYWlsIjoidHJlZUB0cmVlLmNvbSIsInBob25lIjpudWxsLCJwYXNzd29yZCI6IiQyYSQxMCRIQVJPTy5PUEdYWFBvVktXOVhmYnZldkJRWldRaXNJa2JpT09WZHlsNmZxMlF2aURPOExBYSIsInZlcmlmeV9jb2RlIjoiMHdkZWlwYjkiLCJzdGF0dXMiOiIiLCJpZCI6MTYsImFkZHJlc3MiOm51bGwsImNvdW50cnkiOm51bGwsInN0YXRlIjpudWxsLCJwaW5jb2RlIjpudWxsLCJvcmdfaWQiOjAsInJvbGVzIjpudWxsLCJjcmVhdGVfZGF0ZSI6IjIwMTctMDUtMThUMTk6NTE6MDYuMDAwWiIsImxhc3RfbG9naW4iOiIyMDE3LTA1LTE4VDE5OjUxOjA2LjAwMFoiLCJhdmF0YXJfdXJsIjpudWxsfQ.umxBRd2sazaADSDOW0e8rO5mKDpQYIK1hsaQMZriZFE 

application/json 

以上API給了我只有在正確的令牌傳遞的數據,似乎工作的罰款。

然而,在客戶端,我可以得到令牌檢索使用JWT解碼,而不使用在客戶端的任何祕密,如果令牌是由中間人抓什麼,怎樣才能安全得到增強?
有我丟失的東西要有正確使用智威湯遜對我的節點API路線?

有些地方我看到當我嘗試使用承載我得到驗證錯誤後,得到信息的授權作爲bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiYXR1bCIsImVtYWlsIjoidHJlZUB0cmVlLmNvbSIsInBob25lIjpudWxsLCJwYXNzd29yZCI6IiQyYSQxMCRIQVJPTy5PUEdYWFBvVktXOVhmYnZldk 通過。 什麼是這個持票人和JWT被傳遞到頭值?

我正在使用passport-jwt var JwtStrategy = require('passport-jwt')。

回答

1

要使用JWT令牌,你必須使用SSL(HTTPS)。沒有它,你根本就沒有保護。

JWT令牌簽署(檢查site)。所以如果有人(中間人)試圖改變它,它將會失效。

智威湯遜和承載是基本相同的事情。它們只是authorization標題的auth scheme

的「智威湯遜auth schemepassport-jwt的默認。 如果你想改變它,你可以使用不同的jwtFromRequest值。

參見:

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

希望其明確的。

相關問題