簡體   English   中英

我應該如何存儲RESTful API生成的令牌?

[英]How should I store a token generated by a RESTful API?

我已經構建了一個API,為登錄的用戶生成一個身份驗證令牌。此時我還有一個用Node.JS編寫的客戶端應用程序。
當我使用客戶端應用程序的用戶憑據向API發出請求時,我獲得了身份驗證令牌:我應該如何將其存儲在客戶端應用程序中? 每次我想要請求API時,我都不應該請求令牌,對嗎?
我想過將令牌放在Cookie中,但我不認為這是最好的解決方案。 你會推薦什么?

成功登錄后,應在服務器端創建唯一的一次性令牌,並根據用戶ID和時間戳存儲在數據庫中。 您將令牌存儲在cookie客戶端。 然后,將令牌傳遞給每個后續API調用。 然后服務器應該檢查令牌是否有效(即沒有過期,比如發布或更新少於30分鍾前說)。 如果它有效,您可以檢索針對該令牌存儲的用戶詳細信息,並執行您需要的任何后端功能(當用戶通過身份驗證時)。 然后,您可以更新該令牌的時間戳(刷新會話,因為您希望在沒有用戶交互的30分鍾之后登錄超時)。 如果在獲得API調用時令牌已過期或不存在,請重定向到登錄頁面。

此外,您可能已經知道這一點,但要確保令牌是唯一且不可猜測的,我傾向於生成新的隨機GUID並加密它們,不要使用sequentail id或類似的東西。

我認為這個鏈接可以幫助你:

實際上,您應該有一個具有過期日期的令牌,因此您不必在每次發送請求之前獲取新令牌。 當令牌過期時,您只需要從服務“刷新令牌”中獲取一個新令牌。

關於如何在客戶端應用程序中存儲令牌的問題,我認為您可以將其保存在內存中(地圖或嵌入式數據庫)。

否則完成,我不認為在這種用例中使用cookie是個好主意。

希望它會對你有所幫助。 蒂埃里

我們正在開發一個使用非常類似方法的應用程序。 客戶端應用程序是靜態HTML5 / JS單頁面應用程序(無需任何服務器端生成)並與API服務器通信。

最好的方法是將會話令牌存儲在內存中:即,在JS代碼中的變量內。 如果您的客戶端應用程序是單個頁面,那應該不是問題。
除此之外,我們還將會話令牌保留在sessionStorage中,以便在用戶刷新頁面時保留它。 要在創建新選項卡時保留令牌(sessionStorage特定於瀏覽器窗口),我們還會在關閉頁面時將其存儲在localStorage中,以及打開選項卡的計數器(當應用程序的所有選項卡都關閉時,我們刪除令牌。

// Handle page reloads using sessionStorage
var sess = sessionStorage.getItem('session-token')
if(sess && sess !== 'null') { // Sometimes empty values are a string "null"
    localStorage.setItem('session-token', sess)
}

// Set a counter to check when all pages/tabs of the application are closed
var counter = parseInt(localStorage.getItem('session-counter') || 0, 10)
counter++
localStorage.setItem('session-counter', counter)

// Event fired when the page/tab is closing
window.onbeforeunload = function() {
    var counter = parseInt(localStorage.getItem('session-counter') || 0, 10)
    counter--
    localStorage.setItem('session-counter', counter)

    // All pages are closed: remove the session token
    if(counter <= 0) {
        // Handle page reloads using sessionStorage
        sessionStorage.setItem('session-token', localStorage.getItem('session-token'))

        localStorage.removeItem('session-token')
    }
}

有關localStorage和sessionStorage的更多信息: https//developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API

為什么不是餅干? Cookie有兩個原因:1。它們通常更具持久性,可以在瀏覽器窗口和標簽之間共享,即使在瀏覽器關閉后它們也可以保留。 2.但最重要的是,根據HTTP規范,每次發出請求時都必須將它們發送到Web服務器。 如果您正在設計一個客戶端與API服務器完全分離的應用程序,則您不希望客戶端的服務器在任何情況下都能看到(或記錄!)會話令牌。

一些額外的建議:

  1. 會話令牌必須到期。 您可以通過在服務器上的數據庫中存儲會話令牌並在每個請求上驗證它們和/或“簽名”它們來實現這一點(以明文形式向令牌添加時間戳,然后添加簽名部分,例如HMAC哈希,使用您只知道的密鑰編碼的時間戳)。
  2. 令牌可以在其生命中重復使用多次。 但是,在一定的秒數后,您可能希望服務器刷新令牌,使舊令牌無效並向客戶端發送新令牌。

暫無
暫無

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

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