2017-06-03 75 views
2

最近我一直在對json網絡令牌進行一些研究。從我所收集到的信息來看,它的一大優點就是它的無狀態。正如許多文章所述,您需要對用戶進行身份驗證所需的一切都與請求一起提供,因此您無需「按照每個請求來訪問數據庫」。json網絡令牌,護照-jwt及其驗證功能

但是,如果我沒有弄錯,passport-jwt的文檔就是這樣做的,它們在每個請求中都會觸發數據庫。也就是說,對於每個需要通行證驗證的請求。

passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
    //this is a database call 
    User.findOne({id: jwt_payload.sub}, function(err, user) { 
     if (err) { 
      return done(err, false); 
     } 
     if (user) { 
      done(null, user); 
     } else { 
      done(null, false); 
      // or you could create a new account 
     } 
    }); 
})); 

我的印象是,到時候這個函數被調用,令牌已經過驗證,否則這一功能將不會被調用,而用戶得到了401 unauthorized

那麼爲什麼要檢查用戶的數據庫?由於這段代碼在文檔中,我通過檢查數據庫來做同樣的事情,但是我真的需要嗎?爲什麼我不應該這樣做

passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
    //this is a database call 
    done(null, {id: jwt_payload.sub}) 
})); 

回答

0

我不同意萊安德羅。他是不正確時,他說:

有人可能會使用它自己的道理,訪問您的API.`

你在你的思維正確的,它是智威湯遜autentication的主要驅動力。您使用另一張護照過濾器驗證密碼,並簽發簽名的 JWT令牌。由於它由您的Sekret簽名,因此無法修改。用另一個sekret創建的任何其他JWT令牌都將無法驗證。

我正要創建一個與passport-jwt有關的問題,並且我找到了this closed issue,其中有人指出了您在文檔中遇到的問題。

我沒有使用passport-jwt,因爲我發現使用passport-custom更簡單,只需自行設置cookie即可。

值得注意的是,您可能仍然需要檢查數據庫。如果您有像api\getSuperSekretUserInfo\[userId]這樣的API調用,那麼您需要檢查request.user.id === params.userId(或其他)。同樣,如果您訪問的是api\getInvoice\231,則需要檢查ID爲231的發票屬於request.user中的用戶。

JWT驗證僅檢查令牌是否由您發出,即用戶已登錄。但是您可以確定令牌中的信息未被篡改,並將其用於任何進一步檢查 - 可能需要或可能不需要數據庫調用。