2015-10-02 98 views
2

您好我正在創建使用REST API端點與服務器端進行通信的移動本機應用程序。
我曾經有開發本地客戶端的經驗,但我有簡單的令牌(隨機生成的字符串)存儲在數據庫中的用戶信息存儲在同一個表中。所以它就像在瀏覽器中使用的會話,但不是Cookie,每個請求在標題中都有標記。JWT令牌登錄和註銷

最近我編輯了JWT令牌。這似乎是保護私密端點的好方法。您可以向移動客戶端請求令牌,只要您通過+登錄並獲取生成的令牌即可。
但是重要的是這個令牌不存儲在服務器上的任何地方,服務器使用私鑰對服務器進行驗證,祕密字對私人服務器是私有的。
對於受保護的端點無妨,但如果我需要用戶會話時該怎麼辦,例如Facebook,Amazon,Aliexpress等應用程序如何工作,他們有能力在不提供憑據的情況下使用應用程序,只需瀏覽商店,但是當用戶不想購買時需要登錄。之後,用戶會話保持一段時間。 這可以使用JWT令牌實現而沒有任何問題,但是當用戶需要註銷時,在這種情況下該怎麼辦?令牌不會存儲在服務器上的任何位置,那麼如何銷燬此令牌以使其無效?

如果令牌存儲在數據庫中,則API不是無狀態的,因爲REST API應該是。 所以一般來說,沒有辦法讓用戶登錄到無狀態的API中,對嗎?

我有一些想法如何使用JWT令牌來實現這一點,但這也不會是無狀態的API,據我所知。

  1. 創建過期令牌
  2. 名單
  3. 存儲在數據庫中智威湯遜的道理,但什麼是自描述性的記號在這種情況下,目的(JWT),如果它被存儲在數據庫中,智威湯遜的主要思想如我所知,用令牌保留所有信息。

請建議在這種情況下最好的方法是什麼,糾正我,如果我錯了。
謝謝。

回答

0

JWT認證基本上發生在客戶端和服務器端。

當用戶發送用戶名和密碼進行身份驗證時。它對數據庫進行檢查,如果有效,會生成一個joken並將其發回給用戶。有多種API用於生成JWT令牌,您可以檢出http://jwt.io/

一旦令牌生成併發送回來,它就需要在每個請求中隨同標頭一起發送,並且需要在服務器端進行驗證,然後將API提供給用戶。

由於API本身允許您在服務器端對其進行解碼,因此無需存儲該令牌。

+4

什麼註銷是最主要的問題我在我intrested – eemrxoha

2

如果您使用的是JWT,那麼您無法擁有服務器端狀態,以便正確註銷用戶而不會破壞首先使用JWT的目的。如果你想這樣做,最好的選擇是在DB和JWT中保存最後的註銷日期,如果這些日期不匹配,則註銷用戶(不更新本例中的日期)。但是,您現在有服務器端狀態。

在數據庫中存儲註銷令牌看起來像是過度殺傷。

另一種選擇是,您可以生成由CSPRNG生成的128位令牌,將此值使用SHA-256存儲在數據庫中,然後在Web令牌中使用unhash值。這樣您可以簡單地刪除條目以註銷用戶服務器端。這是更安全的選項,因爲您現在有辦法正確過期服務器上的令牌和會話。如果用戶更改密碼,或者想要通過註銷其他會話來保護其帳戶,現在可以執行此操作。

-1

如果您需要註銷用戶,請提供註銷鏈接。例如,服務器應該通過用任何空數組編碼令牌來重置會話數據。用戶將有一個有效的會話,但不會有有效的信息來驗證它們。

在登錄時有效令牌

$data = array("id"=>1,"user_type"=>"Admin"); 
$token = JWT:encode($data, $key); 

驗證令牌

$token = $_POST['token']; 
$data = JWT:decode($data, $key, $hash); 
if($data.id){ 
return "valid token"; 
}else{ 
return "invalid token" 
}