2015-02-09 42 views
15

密鑰和訪問令牌JWT在快遞以及與Facebook的NodeJS我有兩個應用:維持在REST API

  • 服務器(REST API服務器)
    • 節點JS
    • 快遞
    • jsonwebtokens
    • express-jwt
    • 貓鼬
  • 客戶端(便攜式前端)
    • 自舉
    • 角JS
    • 本地存儲
    • 角的Facebook
    • 角JWT

Lateron,客戶端應用程序將移植到Android,iPhone和其他平臺使用phon EGAP。對於OAuth,我使用Facebook作爲提供者。現在,我剛剛意識到JSON Web Tokens是這種設置的方式。我的問題是架構問題而不是語法問題 - 如何在使用nodejs中的JWT簽署Facebook訪問令牌和用戶ID時管理密鑰?

因此,這是流在我的應用程序是如何工作的:

  1. 客戶有一個登錄按鈕
  2. 用戶點擊按鈕> Facebook的身份驗證開始
  3. 客戶接收user_id說明和FB訪問令牌
  4. 客戶端發送[POST json主體] ser_id和訪問令牌節點+ Express服務器'http://server.com/auth/login'
  5. 節點服務器已申請快遞,智威湯遜的所有路線,除了/認證/註冊

    VAR expressJwt = require('express-jwt');

    var jwt = require('jsonwebtoken'); ({secret:''})。except({path:['/ auth/login']}));

  6. 節點服務器req.body接收數據,使用

    VAR令牌= expressjwt它提取使用JavascriptSDK來自Facebook的所有配置文件的細節,和標誌。標誌({profile},);

  7. 節點服務器存儲(更新,如果USER_ID存在)的新令牌中分貝並且將其作爲響應於客戶
  8. 客戶將其存儲爲在本地存儲
  9. JSON數據接收的新令牌
  10. 客戶端使用角JWT從新令牌提取輪廓數據,並自動連接在授權報頭的新的令牌用於將其發送到服務器
所有請求

現在,我的問題是:

  1. 我真的需要將JWT標記存儲在數據庫中嗎?我當然不會將請求標頭中的標記與數據庫進行比較
  2. 每次有人登錄時,是否需要爲安全生成隨機密鑰?如果是的話,那麼客戶端和服務器會如何呢?
  3. 何時何地需要檢查令牌過期?以及如何刷新它?

我有點迷失了設計流程和機制。

+0

所以現在終於你怎麼做呢??你使用一些數據庫來存儲撤銷令牌或什麼?請回復一定會對我真的有幫助 – 2016-01-13 22:36:18

回答

13

廣告1.您不必將JWT存儲在數據庫中。用戶ID可以是有效負載的一部分,因此不需要它。

Ad 2.服務器端應用程序使用一個密鑰生成所有JWT是一種常見做法。

Ad 3.檢查每個API請求是否已過期,如果令牌已過期則禁止訪問,返回401狀態碼。客戶端應用程序應提示用戶輸入憑據並請求新的JWT。如果您想避免用戶重新提交憑據,您可以發出刷新令牌,稍後可用於生成新的JWT。

JWT refresh token flow

http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-asp-net-web-api-2-owin/

+0

感謝您的回答。請您詳細說明一下:如果我想從服務器端撤銷特定令牌的訪問,該怎麼辦?而且,如果我嘗試爲每個用戶生成一個新的密鑰,對於客戶端,我是否應該對它進行哈希處理並將其存儲在本地存儲中,以解碼新的令牌以從負載中提取信息? – 2015-02-10 06:28:29

+0

正確實施時,您可以相信用戶的JWT有效負載是您最初發送給他們的_unaltered_數據。你可以利用它來撤銷一個令牌:爲每個有效負載添加一個「有效」標誌,如果它設置爲false,則強制重新授權。 – sedge 2015-05-18 20:29:52

+0

是的,但如果有人註銷比如果你沒有撤銷這個令牌現在別人可以使用這個令牌的一生? – 2016-01-13 22:35:03