引入 jwt 擴展
安裝jwt 擴展
composer require firebase/php-jwt
直接在 composer.json / require / 下 云行 composer update 更新
"firebase/php-jwt": "^5.2",
控制器
public function login(Request $request)
{
//接收表單引數
$params = input();
// 用來 捕獲錯誤
try {
validate(\app\validate\Login::class)->check($params);
}catch (ValidateException $exception){
return json(['code'=>1001,'msg'=>$exception->getMessage(),'data'=>'']);
}
$model = User::login($params)->toArray();
if ($model){
$token = Token::MakeToken($model);
return json(['code'=>200,'msg'=>'登錄成功','data'=>['user'=>$model,'token'=>$token]]);
}
return json(['code'=>1001,'msg'=>'賬號或密碼錯誤','data'=>'']);
}
封裝jwt token
<?php
declare (strict_types = 1);
namespace tools\jwt;
use think\Exception;
use \Firebase\JWT\JWT; //匯入JWT
class Token
{
/**
* 簽發Token
* @param string $key Token簽名
* @param array $data 加密的資訊
* @return string
*/
public static function MakeToken(array $data,string $key = 'key' )
{
//key
$time = time(); //當前時間
$token = [
'iss' => 'http://www.helloweba.net', //簽發者 可選
'aud' => 'http://www.helloweba.net', //接收該JWT的一方,可選
'iat' => $time, //簽發時間
'nbf' => $time , //(Not Before):某個時間點后才能訪問,比如設定time+30,表示當前時間30秒后才能使用
'exp' => $time+7200, //過期時間,這里設定2個小時
'data' => $data //自定義資訊,不要定義敏感資訊
];
$_token=JWT::encode($token, $key); //輸出Token
return $_token;
}
/**
* 決議Token
* @param string $Token 令牌
* @param string $key 簽名
* @return array
*/
public static function ParseToken(string $Token,string $key='key')
{
//key要和簽發的時候一樣
$jwt = $Token; //簽發的Token
try {
JWT::$leeway = 60;//當前時間減去60,把時間留點余地
$decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式,這里要和簽發的時候對應
$arr = (array)$decoded;
// print_r($arr);
return $arr;
} catch(\Firebase\JWT\SignatureInvalidException $e) { //簽名不正確
echo $e->getMessage();
}catch(\Firebase\JWT\BeforeValidException $e) { // 簽名在某個時間點之后才能用
echo $e->getMessage();
}catch(\Firebase\JWT\ExpiredException $e) { // token過期
echo $e->getMessage();
}catch(Exception $e) { //其他錯誤
echo $e->getMessage();
}
//Firebase定義了多個 throw new,我們可以捕獲多個catch來定義問題,catch加入自己的業務,比如token過期可以用當前Token重繪一個新Token
}
}
創建中間件
php think make:middleware Check
在public 下的 .htaccess里面加多一項
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/?s=$1 [QSA,PT,L]
#增加下面這項
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
</IfModule>
撰寫中間件代碼
public function handle(Request $request, \Closure $next)
{
//
$token = $request->header('authorization');
if (!$token) {
return json(['code'=>1002,'msg'=>'token 驗證失敗']);
}
//下面的這個判斷不存在 只能在laravel里用 tp 沒有這個方法
if ($request->bearerToken()){
dd('沒有token ,非法請求');die();
}
return $next($request);
}
控制器引入中間件
protected $middleware = [Auth::class];
**以上若有問題歡迎打擾 **
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286896.html
標籤:其他
上一篇:Qt Event(Qt事件)
