2015-02-23 102 views
3

我們當前的應用程序使用HTTP會話,我們希望用JWT替換它。每個用戶JWT和一個(!)會話/無併發會話

該設置允許每個用戶只有一個會話。這意味着:在

  1. 用戶標誌在設備1個
    • 用戶在設備1(創建新會話)在設備2
      • 用戶是
    • 用戶標誌記錄在在設備2(創建新會話)時登錄
    • 用戶爲而不是在設備1登錄(會話被破壞)

這工作,因爲有會話ID和用戶ID之間的服務器端的關係。


使用JWT我能想象到有用戶數據庫裏面的一些櫃檯,而它與每一個登錄增加,即:在設備1

  • JWT令牌簽名包含

    1. 用戶跡象計數器+ 1(並保存新的計數器到數據庫)
  • 用戶登錄設備2
    • JWT的簽名包含counter + 1,它會增加並保存到db。現在
  • 每個請求我要檢查如果傳入的簽名是否爲當前計數器值正確。

    這不知何故使它有狀態:(

    但是... JWT的一個好處是,無需訪問任何數據庫或會話存儲以驗證令牌。


    是否有其他解決方案來防止併發登錄?也許有些東西沒有數據庫訪問,並保持無狀態?

    +0

    您可以在JWT簽名並向客戶端發送JWT時在JWT中創建自定義聲明。當他們將令牌發回給您時,請確認例如'device_id'等具體聲明沒有改變。這有點棘手,但你可能不得不在服務器端的會話上做一些工作,即使你試圖避免這種情況。 – Signus 2015-06-03 22:37:35

    回答

    0

    您非常接近解決方案。

    要做到這一點,你需要以下條件:
    1.包含IAT令牌(時值發出令牌)
    2.在一些地方保存,當用戶最後登錄,例如在用戶的配置文件的時間。

    現在驗證令牌時,請執行額外的檢查:iat(Issued At)必須等於或晚於上次登錄時間。這隱含地使舊的令牌失效。