登錄
-
第一次認證:第一次登錄,用戶從瀏覽器輸入用戶名/密碼,提交后到服務器的登錄處理的Action層(Login Action);
-
Login Action調用認證服務進行用戶名密碼認證,如果認證通過,Login Action層調用用戶信息服務獲取用戶信息(包括完整的用戶信息及對應權限信息);
-
返回用戶信息后,Login Action從配置文件中獲取Token簽名生成的秘鑰信息,進行Token的生成;
-
生成Token的過程中可以調用第三方的JWT Lib生成簽名后的JWT數據;
-
完成JWT數據簽名后,將其設置到COOKIE對象中,並重定向到首頁,完成登錄過程;
請求認證
基於Token的認證機制會在每一次請求中都帶上完成簽名的Token信息,這個Token信息可能在COOKIE中,也可能在HTTP的Authorization頭中;
-
客戶端(APP客戶端或瀏覽器)通過GET或POST請求訪問資源(頁面或調用API);
-
認證服務作為一個Middleware HOOK 對請求進行攔截,首先在cookie中查找Token信息,如果沒有找到,則在HTTP Authorization Head中查找;
-
如果找到Token信息,則根據配置文件中的簽名加密秘鑰,調用JWT Lib對Token信息進行解密和解碼;
-
完成解碼並驗證簽名通過后,對Token中的exp、nbf、aud等信息進行驗證;
-
全部通過后,根據獲取的用戶的角色權限信息,進行對請求的資源的權限邏輯判斷;
-
如果權限邏輯判斷通過則通過Response對象返回;否則則返回HTTP 401;
對Token認證的幾點認識
-
一個Token就是一些信息的集合;
-
在Token中包含足夠多的信息,以便在后續請求中減少查詢數據庫的幾率;
-
服務端需要對cookie和HTTP Authrorization Header進行Token信息的檢查;
-
基於上一點,可以用一套token認證代碼來面對瀏覽器類客戶端和非瀏覽器類客戶端;
-
因為token是被簽名的,所以我們可以認為一個可以解碼認證通過的token是由我們系統發放的,其中帶的信息是合法有效的;