1. 伺服器生成token
如果對安全性要求較高,可以對app端的某些用戶信息或mac/ip等進行加密散列生成token;通常就使用uuid生成一個隨機值作為token就好了。是否寫進資料庫看自己的業務需求,比如如果要求伺服器掛掉重啟之後客戶端帶著掛掉前的token能夠正常訪問,那就需要寫進資料庫。
2. JWT生成token及過期處理方案
業務場景
在前後分離場景下,越來越多的項目使用token作為介面的安全機制,APP端或者WEB端(使用VUE、REACTJS等構建)使用token與後端介面交互,以達到安全的目的。本文結合stackover以及本身項目實踐,試圖總結出一個通用的,可落地的方案。
基本思路
用戶僅登錄一次,用戶改變密碼,則廢除token,重新登錄
1.0實現
1.登錄成功,返回access_token和refresh_token,客戶端緩存此兩種token;2.使用access_token請求介面資源,成功則調用成功;如果token超時,客戶端攜帶refresh_token調用中間件介面獲取新的access_token;3.中間件接受刷新token的請求後,檢查refresh_token是否過期。如過期,拒絕刷新,客戶端收到該狀態後,跳轉到登錄頁;如未過期,生成新的access_token和refresh_token並返回給客戶端(如有可能,讓舊的refresh_token失效),客戶端攜帶新的access_token重新調用上面的資源介面。4.客戶端退出登錄或修改密碼後,調用中間件注銷舊的token(使access_token和refresh_token失效),同時清空客戶端的access_token和refresh_toke。
後端表id user_id client_id client_secret refresh_token expire_in create_date del_flag
2.0實現
場景: access_token訪問資源 refresh_token授權訪問 設置固定時間X必須重新登錄
1.登錄成功,後台jwt生成access_token(jwt有效期30分鍾)和refresh_token(jwt有效期15天),並緩存到redis(hash-key為token,sub-key為手機號,value為設備唯一編號(根據手機號碼,可以人工廢除全部token,也可以根據sub-key,廢除部分設備的token。),設置過期時間為1個月,保證最終所有token都能刪除),返回後,客戶端緩存此兩種token;2.使用access_token請求介面資源,校驗成功且redis中存在該access_token(未廢除)則調用成功;如果token超時,中間件刪除access_token(廢除);客戶端再次攜帶refresh_token調用中間件介面獲取新的access_token;3.中間件接受刷新token的請求後,檢查refresh_token是否過期。如過期,拒絕刷新,刪除refresh_token(廢除); 客戶端收到該狀態後,跳轉到登錄頁;如未過期,檢查緩存中是否有refresh_token(是否被廢除),如果有,則生成新的access_token並返回給客戶端,客戶端接著攜帶新的access_token重新調用上面的資源介面。4.客戶端退出登錄或修改密碼後,調用中間件注銷舊的token(中間件刪除access_token和refresh_token(廢除)),同時清空客戶端側的access_token和refresh_toke。5.如手機丟失,可以根據手機號人工廢除指定用戶設備關聯的token。6.以上3刷新access_token可以增加根據登錄時間判斷最長X時間必須重新登錄,此時則拒絕刷新token。(拒絕的場景:失效,長時間未登錄,頻繁刷新)
2.0 變動1.登錄2.登錄攔截器3.增加刷新access_token介面4.退出登錄5.修改密碼
3.0實現
場景:自動續期 長時間未使用需重新登錄
1.登錄成功,後台jwt生成access_token(jwt有效期30分鍾),並緩存到redis(hash-key為access_token,sub-key為手機號,value為設備唯一編號(根據手機號碼,可以人工廢除全部token),設置access_token過期時間為7天,保證最終所有token都能刪除),返回後,客戶端緩存此token;
2.使用access_token請求介面資源,校驗成功且redis中存在該access_token(未廢除)則調用成功;如果token超時,中間件刪除access_token(廢除),同時生成新的access_token並返回。客戶端收到新的access_token,再次請求介面資源。
3.客戶端退出登錄或修改密碼後,調用中間件注銷舊的token(中間件刪除access_token(廢除)),同時清空客戶端側的access_token。
4.以上2 可以增加根據登錄時間判斷最長X時間必須重新登錄,此時則拒絕刷新token。(拒絕的場景:長時間未登錄,頻繁刷新)
5.如手機丟失,可以根據手機號人工廢除指定用戶設備關聯的token。
3.0 變動
1.登錄2.登錄攔截器3.退出登錄4.修改密碼
1.3 場景:token過期重新登錄 長時間未使用需重新登錄
1.登錄成功,後台jwt生成access_token(jwt有效期7天),並緩存到redis,key為 "user_id:access_token",value為access_token(根據用戶id,可以人工廢除指定用戶全部token),設置緩存過期時間為7天,保證最終所有token都能刪除,請求返回後,客戶端緩存此access_token;
2.使用access_token請求介面資源,校驗成功且redis中存在該access_token(未廢除)則調用成功;如果token超時,中間件刪除access_token(廢除),同時生成新的access_token並返回。客戶端收到新的access_token,再次請求介面資源。
3.客戶端退出登錄或修改密碼後,調用中間件注銷舊的token(中間件刪除access_token(廢除)),同時清空客戶端側的access_token。
4.以上2 可以增加根據登錄時間判斷最長X時間必須重新登錄,此時則拒絕刷新token。(拒絕的場景:長時間未登錄,頻繁刷新)
5.如手機丟失,可以根據手機號人工廢除指定用戶設備關聯的token。
1.3 變動
1.登錄2.登錄攔截器3.退出登錄4.修改密碼
2.0 場景: access_token訪問資源 refresh_token授權訪問 設置固定時間X必須重新登錄
1.登錄成功,後台jwt生成access_token(jwt有效期30分鍾)和refresh_token(jwt有效期15天),並緩
存到redis(hash-key為token,sub-key為手機號,value為設備唯一編號(根據手機號碼,可以人工廢除全
部token,也可以根據sub-key,廢除部分設備的token。),設置過期時間為1個月,保證最終所有token都
能刪除),返回後,客戶端緩存此兩種token;
2.使用access_token請求介面資源,校驗成功且redis中存在該access_token(未廢除)則調用成功;如果
token超時,中間件刪除access_token(廢除);客戶端再次攜帶refresh_token調用中間件介面獲取新的
access_token;
3.中間件接受刷新token的請求後,檢查refresh_token是否過期。
如過期,拒絕刷新,刪除refresh_token(廢除); 客戶端收到該狀態後,跳轉到登錄頁;
如未過期,檢查緩存中是否有refresh_token(是否被廢除),如果有,則生成新的access_token並返回給
客戶端,客戶端接著攜帶新的access_token重新調用上面的資源介面。
4.客戶端退出登錄或修改密碼後,調用中間件注銷舊的token(中間件刪除access_token和refresh_token(
廢除)),同時清空客戶端側的access_token和refresh_toke。
5.如手機丟失,可以根據手機號人工廢除指定用戶設備關聯的token。
6.以上3刷新access_token可以增加根據登錄時間判斷最長X時間必須重新登錄,此時則拒絕刷新token。(
拒絕的場景:失效,長時間未登錄,頻繁刷新)
2.0 變動
1.登錄
2.登錄攔截器
3.增加刷新access_token介面
4.退出登錄
5.修改密碼
3.0 場景:自動續期 長時間未使用需重新登錄
1.登錄成功,後台jwt生成access_token(jwt有效期30分鍾),並緩存到redis(hash-key為
access_token,sub-key為手機號,value為設備唯一編號(根據手機號碼,可以人工廢除全部token,也可以
根據sub-key,廢除部分設備的token。),設置access_token過期時間為1個月,保證最終所有token都能刪
除),返回後,客戶端緩存此token;
2.使用access_token請求介面資源,校驗成功且redis中存在該access_token(未廢除)則調用成功;如果
token超時,中間件刪除access_token(廢除),同時生成新的access_token並返回。客戶端收到新的
access_token,
再次請求介面資源。
3.客戶端退出登錄或修改密碼後,調用中間件注銷舊的token(中間件刪除access_token(廢除)),同時清
空客戶端側的access_token。
4.以上2 可以增加根據登錄時間判斷最長X時間必須重新登錄,此時則拒絕刷新token。(拒絕的場景:長
時間未登錄,頻繁刷新)
5.如手機丟失,可以根據手機號人工廢除指定用戶設備關聯的token。
3.0 變動
1.登錄
2.登錄攔截器
3.退出登錄
4.修改密碼
4.0 場景:token過期重新登錄 長時間未使用需重新登錄
1.登錄成功,後台jwt生成access_token(jwt有效期7天),並緩存到redis,key為
"user_id:access_token" + 用戶id,value為access_token(根據用戶id,可以人工廢除指定用戶全部
token),設置緩存過期時間為7天,保證最終所有token都能刪除,請求返回後,客戶端緩存此
access_token;
2.使用access_token請求介面資源,校驗成功且redis中存在該access_token(未廢除)則調用成功;如果
token超時,中間件刪除access_token(廢除),同時生成新的access_token並返回。客戶端收到新的
access_token,
再次請求介面資源。
3.客戶端退出登錄或修改密碼後,調用中間件注銷舊的token(中間件刪除access_token(廢除)),同時清
空客戶端側的access_token。
4.以上2 可以增加根據登錄時間判斷最長X時間必須重新登錄,此時則拒絕刷新token。(拒絕的場景:長
時間未登錄,頻繁刷新)
5.如手機丟失,可以根據手機號人工廢除指定用戶設備關聯的token。
4.0 變動
1.登錄
2.登錄攔截器
3.退出登錄
4.修改密碼
最終實現
後端
3. token是後端還是前端生成的
是伺服器端生成的,做身份驗證用的。
4. 後端如何發送touken
登錄後端之後採取合適的路徑發送。
具體步驟如下:
1、在後端登錄介面中,如果密碼驗證成功,則使用jwt模塊生成token。
2、將token響應給客戶端。
3、客戶端在登錄頁面中,通過then獲取token,再將token設置到localStorage里。
4、每當要發送請求時,就可以通過localStorage來讀取token,放在對伺服器的請求中,使得伺服器能夠驗證並返回用戶數據(路由守衛皆可)。這樣就可以發送了。
5. 服務端tokenid 怎麼生成的
先訪問驗證介面。介面輸出一個根據用戶信息生成的token(內容格式隨意)和uid。然後後邊的每次提交提交token和uid,服務端驗證即可。
6. Php用戶登陸後的token一般怎麼生成的app端
這個需要php後端生成,當登錄成功的時候,後端通過用一些信息通過演算法組合成token,返回給app端,app端接收保存。這個token盡量做成可以還原解析
7. 網頁token在哪裡獲取
token令牌是現在常見的登錄認證方式,一般為後端返回來後對前端數據進行對比,首次登錄時,本地時沒有token的,在登錄成功後後端會返回一段加密的token,從而存儲在前端,當再次登錄或打開時,就會自動發送登錄請求並把本地token一般發送,後端接收到後會被token進行驗證從而實現驗證,獲取到token需要後端返回