前後端分離,使用token的方式校驗使用者資訊,我選擇了jwt,使用的教程在網上可以找到很多,不做介紹。
這裡說明乙個使用過程中,最重要的的乙個環節重新整理token帶來的問題。
業務要達到的目標:
使用者登入一次之後,前端儲存token,後面每次向後端請求的時候,header都帶上authorization資訊,後端從請求中解析token,根據token驗證使用者資訊,返回相應的資訊。
相信大部分看過文件並開始使用的同學都已經走通到這裡了,下面是入坑的開始:
1. 產品要求
半個月內免登陸,這裡就要使用到了refreshtoken了,jwt設計思想很到位:設定發給前端的token乙個有效期,比如2個小時,2個小時候前端發來的token就會失效,這個時候我們根據發來的token判斷下,如果這個token在2個小時外,並在重新整理token的有效期內(比如半個月內),那麼我們在給前端返回資料的時候返回乙個新token,前端接到這個token儲存起來,當再次請求的時候,傳送新的token,如此周而復始,只要你在半個月內沒有間斷去進入系統,那麼完全不需要去進行登入的操作。
2. 問題
1)如何將新的token發給前端比較好?
這個問題答案簡單,在response 的header中設定authorization。
關鍵點:後端一般使用的網域名稱是二級網域名稱比如我的是api.xx.com,會和前端產生乙個跨域的影響,請記得一定要設定
`$response->headers->set('access-control-expose-headers', 'authorization');`
設定跨域的時候還要設定乙個cache-control,這個東西出現的問題真的是莫名其妙,坑了我很久..
`$response->headers->set('cache-control', 'no-store'); // 無的話會導致前端從快取獲取頭token`
2) 一般是在中介軟體中重新整理token,當前請求繼續走,如何在controller中需要根據token調取登入使用者資訊?
一下子可能沒說明問題,簡單理解為:token已經重新整理了,那麼當前token肯定失效了,繼續在controller利用請求中的token肯定會報token失效的錯誤,這裡需要將新token帶到後面的程式處理中,我這裡更改了當前請求頭,將newtoken替換了request header中的authorization。
3) 併發請求。也就是2個小時候之後,同乙個頁面發來了2個請求,這個很正常,比如乙個請求列表資料,乙個請求搜尋的表單,因為token都已失效,那麼難道返回2個新的token回去?
這個問題找了在github裡面看到了issue但是無人回答,jwt肯定不會發兩個新的token回去的,那麼肯定會有乙個token不僅是失效了,重新整理當前token之後,產生新的token,舊token加入到了backlist中了,無法使用,那麼另外乙個請求自然無法成功。我這裡使用redis解決的,將舊token作為鍵,新token作為值,設定乙個30秒過期的時間。當第二個請求來的時候,已經知道token在backlist中了,我們可以去redis查詢下是否存在這麼個舊token,存在的話放行。
3. 關鍵中介軟體**
<?php
use closure;
use jwtauth;
use tymon\jwtauth\exceptions\jwtexception;
use tymon\jwtauth\exceptions\tokenexpiredexception;
use tymon\jwtauth\exceptions\tokeninvalidexception;
use illuminate\support\facades\redis;
class getuserfromtoken
try
$request->headers->set('authorization','bearer '.$token);
} catch (tokenexpiredexception $e) catch (jwtexception $e)
// 過期使用者
return response()->json([
'code' => '2',
'msg' => '賬號資訊過期了,請重新登入',
]);}
} catch (jwtexception $e)
$response = $next($request);
if ($newtoken)
return $response;
}}
一整天的時間耗在這裡了,實踐才會發現問題,累並快樂著解決了^_^ jwt雙token重新整理機制
關於jwt的token認證機制中,token過期後使用者需要重新獲取token會導致系統體驗感差的問題,具體情況描述如下,比如某使用者登入後在臨近過期時,又碰到了操作活躍的時段,如果此時token恰好過期,使用者被迫重新登入,可能引起資料未儲存丟失等一系列問題。這裡引入了乙個概念,即活躍使用者的定義...
jwt 私鑰 使用JWT實現Token認證
json web token的結構是什麼樣的 json web token由三部分組成,它們之間用圓點 連線。這三部分分別是 header payload signature 因此,乙個典型的jwt看起來是這個樣子的 xx.yyyyy.zzzzz 接下來,具體看一下每一部分 header heade...
token與jwt使用例子
token使用例子 1.客戶端登入服務端後,服務端生成乙個隨機碼token,儲存到redis中,設定30分鐘過期,然後將token返回給客戶端 2.客戶端再次登入伺服器並傳送token,服務端根據到redis中查詢到該token相關資訊,返回登入成功 3.token明文傳輸很危險,所以要用https...