在 webman 里安裝了 tinywan/jwt
然后寫了個(gè)中間件在 app/middleware 目錄里
<?php
namespace app\middleware;
use ReflectionClass;
use support\Log;
use Tinywan\Jwt\JwtToken;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
class TokenVerifyMiddleware implements MiddlewareInterface
{
public function process(Request $request, callable $handler) : Response
{
try {
$request->token = JwtToken::getExtend();
}catch (\Exception $e) {
Log::channel('InvalidToken')->warning('錯(cuò)誤碼:' . $e->getCode());
Log::channel('InvalidToken')->warning('錯(cuò)誤信息:' . $e->getMessage());
return json([ 'code' => 200141, 'msg' => '請求未攜帶合法信息。', 'data' => [] ]);
}
return $handler($request);
}
}
因?yàn)槲业慕涌诓皇撬械亩夹枰?jwt token ,所以我在 route.php 里寫類似于:
Route::get('/staffinfo/{mobile}', [app\controller\api\v1\controller\StaffinfoController::class, 'checkStaffinfo'])->middleware([ app\middleware\TokenVerifyMiddleware::class]);
手動(dòng)給路由增加了要驗(yàn)證的TokenVerifyMiddleware中間件。
然后,我在Controller 里寫的是:
public function getOrderinfoDetails(Request $request){
// 獲取 token
$token = $request->token;
$param = [ 'userinfo_id' => $request->input('userinfo_id') ];
// TOKEN 驗(yàn)證身份是否合法
if ($param['userinfo_id'] != $token['id']) {
return json(['code' => 200112,'msg' => '非法請求,請確認(rèn)請求者身份。','data' => []]);
}
// 進(jìn)行參數(shù)校驗(yàn)
$validate = new GetOrderinfoDetailsValidate();
if (!$validate->check($param)) {
return json($validate->getError());
}
// ... ... 這里是具體的邏輯,將處理的數(shù)據(jù)給 $data ... ...
$data = $data ?? [];
return json([ 'code' => 200100, 'msg' => '請求成功', 'data' => $data]);
}
我的問題是,我在 Controller 里寫的跟 token 驗(yàn)證有關(guān)的,咋總覺得很不優(yōu)雅?你們都是如何解決的?求大神們指點(diǎn)!
他不是有g(shù)etCurrentId這個(gè)方法嘛,你可以在中間件里面獲取用戶ID進(jìn)入身份驗(yàn)證呀
就是注冊成功下發(fā)Toekn這樣寫: $user = [
'id' => 1, // 這里必須是一個(gè)全局抽象唯一id
'name' => 'shanyi',
'email' => 'shanyi@163.com'
];
$token =JwtToken::generateToken($user); 這樣就是信息存到Token中了。在中間件用getCurrentId這個(gè)就可以獲取用戶ID了
就是你這個(gè)Token下發(fā)的時(shí)候就是帶著身份信息的,你在中間件驗(yàn)證這個(gè)Token 就可以根據(jù)用戶信息來做驗(yàn)證來檢測是否符合你的業(yè)務(wù)邏輯呀~~
中間件 try {
// 獲取JWT中的用戶ID
$UserId= JwtToken::getCurrentId();
} catch (\Throwable $e) {
return SYerror($e->getCode(),$e->getMessage());
} //你自己的業(yè)務(wù)邏輯