簡體   English   中英

是否可以使用無狀態邏輯(無數據庫)使令牌無效?

[英]Is it possible to invalidate a token with stateless logic (no database)?

我需要服務器(較少后端)和客戶端之間的無服務器通信。 客戶端要求一個令牌。 當客戶端使用此令牌發出請求時,后端會生成一個新令牌並將其發送回客戶端。 當客戶端嘗試使用先前的令牌發出請求時,后端會拒絕它。 我不希望后端在 ram 或數據庫、白名單或黑名單中跟蹤有效/無效令牌。 如果需要,后端可以有一個靜態查找表或/和一個靜態規則/算法來執行此邏輯(以使用令牌有效載荷中的信息)。 那么,是否有可能實現這樣的目標? 有沒有辦法在每個令牌中應用某種信息來知道你是否接受過一次?

也許你可以試試 TOTP, https: //en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm。 這與用於 MFA 的算法相同。

這是python的實現,您也可以找到其他語言的實現。 https://pypi.org/project/pyotp/2.0.1/

后端:

  1. 創建一個隨機密鑰並將其保存在靜態數據庫中。
  2. 當客戶端請求令牌時,使用隨機密鑰創建令牌(+base64 轉換)並發回客戶端。
  3. 當您的服務器獲取令牌時(-base64 轉換)。 使用相同的隨機密鑰驗證收到的令牌。
  4. totp 算法將確保舊令牌無效。

您的令牌通常有效期為 30 秒。 所以你可能想要決定管理令牌的有效性。

  1. 在您的場景中,服務器是無狀態的(至少在身份驗證方面),因此您不能使用服務器的狀態來區分是否已使用收到的令牌。

  2. 此外,在您生成令牌的那一刻,它是在第一次使用之前,因此您無法向其中注入任何表明它是否被使用過的信息:當然,當時您沒有該信息。

所以基本上,如果你的唯一信息容器是這兩個(無狀態服務器和自我生成的令牌)的答案是否定的問題,任何它是如何做; 只是沒有地方可以在生成信息的那一刻(在第一次使用時)放置這一位信息(此令牌是最后一個還是最后一個)。

從理論上講,您可以將此信息發送給第三方實體並在您需要時詢問它......但這只是作弊:如果您不接受 DB 或 RAM 或文件系統存儲,我想將這些信息發送到某個地方通過 API 或其他只是一個被排除的選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM