2016-06-20 51 views
1

假設一個用戶多次登錄不同的設備,然後他們決定他們想要註銷設備的,我們沒有刪除JWT這是該設備的權利提供了方式?阻止特定用戶JWT令牌?

這是我實施的,我不確定這是其他網站如何做,或者它是一個體面的做法。

  1. 用戶登錄
  2. 我創建了一個Redis的會話令牌,其具有關聯
  3. 我保存這個Redis的令牌的JWT
  4. 主題的用戶id +設備名稱我傳回了JWT

既然用戶有JWT,他們現在可以訪問受保護的API端點。可以說用戶想要刪除這個會話,這是我所做的。

  1. 用戶獲取*爲特定的用戶ID(當然他們需要一個有效的JWT來獲取這個數據)
  2. 他們選擇他們想要摧毀redis的會議令牌Redis的會話令牌。
  3. 他們將該令牌發送到/destroy/{token}端點
  4. 使用該令牌將該令牌作爲主題的jwt將不再工作。

這樣做意味着在每個請求中,我將不得不反編譯jwt,獲取redis標記,並查看它是否仍然存在。我想這是不昂貴的使用redis,或任何其他內存數據庫todo。

這是一個堅實/有效的方式嗎?有沒有更好/更簡單的方法來做到這一點?

+0

使用此設置,您是使用刷新令牌還是僅使用JWT訪問令牌? – Wonka

回答

1

在實施中的幾個應用程序JWT認證/授權我也有同樣的問題,並得出了相同的解決方案,如果沒有一個非常相似的一個:

在我的情況,我會保存JWT +用戶名+設備名稱中數據庫,然後我會有一個HTTP請求 DELETE /logout/DeviceName與標頭Authorization: JWTGoesHere

這給了我兩個好處:

  • 我現在可以註銷使用有效JWT從任何設備的用戶(它並不需要是完全一樣的智威湯遜,它只需要爲一個JWT即用戶)。
  • 可以執行「註銷除此之外的所有會話」。

就速度而言,我們開發的應用程序每秒接收數百個請求。 超過90%的這些請求需要授權,這意味着檢查JWT是否在語法上有效,檢查數據庫的存在性以及最後但並非最不重要的檢查是否已過期。

所有這些檢查(使用Redis作爲數據庫)不到10ms。底線是:基準,如果它不需要很長的時間,那麼它不需要任何優化。

希望它有幫助!

+0

很高興聽到別人正在以同樣的方式思考我。因此,您實際上並沒有創建redis會話令牌並將其存儲在JWT中,實際上您只是將整個JWT存儲在redis緩存中,這很有趣。我正在考慮這樣做,但得出的結論是,使用會話令牌並驗證每個請求的有效性會給我一些免費的額外好處。當我有時間時,很樂意在問題中列出它們。 – James111

+0

@Franco謝謝你分享你的方法,的確有幫助:)但是我想知道,你是如何得到DeviceName的(是計算機,iPhone等等,還是除了基本字符串之外還有其他東西)?設備檢測是否在服務器端發生?你推薦什麼軟件包?對不起所有的問題,但這會幫助我和其他人:) – Wonka