2017-02-10 95 views
1

我有一個RESTful API,這將是用戶將通過一組Web /移動客戶端達到,我想弄清楚如何處理令牌身份驗證。我的理解是,傳統的令牌身份驗證的工作原理如下:基於令牌的身份驗證的替代方法

  1. 用戶auths中通過提供用戶名/密碼,接收回令牌和到期
  2. ,直到令牌傳遞的每個請求
  3. 到期後,新的請求令牌(通過提供單獨的「刷新」令牌或僅通過用戶/通過重新認證)

是否有一個很好的理由不爲每個請求生成新的令牌?即:通過用戶/密碼請求初始令牌。該令牌與第一個API請求一起傳遞,該請求返回api響應的內容以及必須通過以下請求傳遞的新令牌...此方法的優點是每個請求(操作)重置'令牌auth的到期,使得令牌到期時間基本上變成用戶可以不註銷而不活動的時間段。有沒有一個很好的理由不使用這種方法?上面列出的方法似乎更常見(這就是爲什麼我問)。

最後,只有一個稍微相關的問題。阻止正在觀看網絡的人從用戶那裏獲取令牌?特別是在第一種方案中,似乎很容易做到(在第二種方法中,您需要捕獲傳入的請求,然後在用戶執行操作之前快速獲取下一個令牌)。

回答

1

從我讀到的是,你想要一個滑動窗口,其中用戶進行身份驗證。到期窗口內的每個新請求都會延長會話。 如果我理解正確,我會建議一種替代方法;每次請求成功通過身份驗證時,都會更新您擁有令牌的商店並更新到期時間。 這樣你就不必費心使用每一次抓取新令牌的麻煩。 所以,是的,有一個很好的理由不這樣做:它不是必需的,只會讓用戶惱火。

通過上述方法,我假設您有一個商店(數據庫),您在其中保留您的代幣+過期日期。

所以整個過程是這樣的:

  1. 用戶提供用戶名+密碼
  2. 在商店創建記錄
  3. 每一個成功的請求時
  4. 時間給用戶令牌
  5. 更新商店

在相關說明上;不要給用戶過期日期。例如,使用cookie時很好,但這僅僅是一種附加的安全措施。

在你稍微相關的問題;如果您不使用TLS/SSL/HTTPS,則無法阻止任何人抓取令牌。始終使用TLS(即SSL,即HTTPS,或多或少)。

+0

我正在使用python w/itsdangerous TimedJSONWebSignatureSerializer(一個JSON Web簽名實現)。所以不,我不認爲我正在使用數據庫來存儲令牌。並且因爲過期是令牌的一部分,所以不能擴展它(您會得到一個新令牌)。澄清:API的'用戶'是我自己的(最終用戶不打算直接使用API​​,只使用其中一個客戶端應用程序)。所以我最關心的是這種方法對安全性的影響。 – guywhoneedsahand

+0

此外,「標準」模型中到期的原因是,客戶可以知道何時請求新的令牌而不必擊中資源,由於認證失敗(令牌過期)而被拒絕,然後請求新鮮令牌。那有意義嗎?很顯然,在滑動認證窗口中,這不是必需的(這也是爲什麼它看起來像個好主意!) – guywhoneedsahand

+0

將過期發送給客戶端的確可以傳達關於何時請求新令牌的信息。但不應該以客戶可以改變它的方式使用它。 在JWT無法完成的情況下,這確實是一種替代方法。 由於您是API的唯一用戶,因此您當然應該如何處理即將到期的令牌。無論如何你都需要做點什麼。但是定期請求新令牌會更容易嗎?保持一切美好和分離。 – harm

相關問題