token使用場景
項目分為兩端pc和h5,對應的用戶表分別為users和members其中users為后台管理員用戶表,memers為項目用戶表,在用戶通過h5登陸的時候使用member模型並且用戶只采用手機號快捷登陸,也就是說member表中的用戶沒有密碼,后台管理員登陸的時候使用的是user模型,我們采取路由中間件的方式進行token的驗簽
為了實現該效果分為以下幾步
一、token的生成
查看https://www.cnblogs.com/mzli/p/10637214.html可了解使用jwttoken的配置,pc端生成token我們使用auth('users')->attempt($data),$data=[用戶名,密碼]
attempt方法的解釋:Attempt to authenticate a user using the given credentials(嘗試使用給定憑據對用戶進行身份驗證)
同樣的pc端使用auth('users')->user($token)來解析token中包含的用戶信息
h5 登錄時我們僅通過用戶id來生成token使用方法為tokenById($id)同樣的可以通過auth('')->user($token)來獲取信息但是這里應該使用member門面如auth('member')->user($token)
二、token的驗簽通過路由中間件
jwttoken本身已經提供了驗證token的中間件--jwt.auth,但是因為我們是兩張表,所以在我們使用的時候應該指定使用member還是user表來查詢對應token的數據
jwttoken驗證token的中間件如下
而在這個中間件中又調用了class BaseMiddleware中的anthenticate方法,anthenticate方法如下
$this->auth就在本類中有一個構造函數,如下
所以也就是說,我們在使用這jwttoken提供的驗證token的中間件jwt.auth中間件的時候我們就應該直接將對應的auth類聲明
所以在路由中應該如下使用
這樣,我們就可以使用對應的模型進行數據的驗證和獲取了
三、如果使用jwttoken中報錯User not found也有可能是因為沒有指定要使用的模型是哪一個,jwttoken無法獲取到對應的用戶數據,報錯沒有這個用戶
報錯
如果出現如上圖報錯,首先查看是否使用 Dingo\Api
如果使用了,可以在 app/Providers/AppServiceProvider.php增加如下代碼
app('Dingo\Api\Exception\Handler')->register(function(AuthenticationException $exception) {
if($exception->getMessage() === "Unauthenticated.")
return response()->json(['code' => 403, 'message' => '', 'data' => '令牌錯誤!']);
});