在 webman 里安装了 tinywan/jwt
然后写了个中间件在 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('错误码:' . $e->getCode());
Log::channel('InvalidToken')->warning('错误信息:' . $e->getMessage());
return json([ 'code' => 200141, 'msg' => '请求未携带合法信息。', 'data' => [] ]);
}
return $handler($request);
}
}
因为我的接口不是所有的都需要 jwt token ,所以我在 route.php 里写类似于:
Route::get('/staffinfo/{mobile}', [app\controller\api\v1\controller\StaffinfoController::class, 'checkStaffinfo'])->middleware([ app\middleware\TokenVerifyMiddleware::class]);
手动给路由增加了要验证的TokenVerifyMiddleware中间件。
然后,我在Controller 里写的是:
public function getOrderinfoDetails(Request $request){
// 获取 token
$token = $request->token;
$param = [ 'userinfo_id' => $request->input('userinfo_id') ];
// TOKEN 验证身份是否合法
if ($param['userinfo_id'] != $token['id']) {
return json(['code' => 200112,'msg' => '非法请求,请确认请求者身份。','data' => []]);
}
// 进行参数校验
$validate = new GetOrderinfoDetailsValidate();
if (!$validate->check($param)) {
return json($validate->getError());
}
// ... ... 这里是具体的逻辑,将处理的数据给 $data ... ...
$data = $data ?? [];
return json([ 'code' => 200100, 'msg' => '请求成功', 'data' => $data]);
}
我的问题是,我在 Controller 里写的跟 token 验证有关的,咋总觉得很不优雅?你们都是如何解决的?求大神们指点!
你要不把webman-admin的middleware的实现看一下得了,正常都是用反射的方式去处理一些免登陆免验权的一些方法
$request->uid = JwtToken::getCurrentId();
if (0 === $request->uid) {
throw new UnauthorizedHttpException();
}
看过,这个就是 webman-admin 的,不知道找的对不
他不是有getCurrentId这个方法嘛,你可以在中间件里面获取用户ID进入身份验证呀
是的,但是还的让前端传过来 userinfo_id , 来进行判断,不知道我的理解对不
不用呀 就是你注册的时候就把用户信息存到Token中呀,前端就正常传这个Toekn呀
就是注册成功下发Toekn这样写: $user = [
'id' => 1, // 这里必须是一个全局抽象唯一id
'name' => 'shanyi',
'email' => 'shanyi@163.com'
];
$token =JwtToken::generateToken($user); 这样就是信息存到Token中了。在中间件用getCurrentId这个就可以获取用户ID了
那也就是说,我不需要判断这个 token 是不是合法,默认认为一切都是 ok的,拿来直接用对吧
就是你这个Token下发的时候就是带着身份信息的,你在中间件验证这个Token 就可以根据用户信息来做验证来检测是否符合你的业务逻辑呀~~
中间件 try {
// 获取JWT中的用户ID
$UserId= JwtToken::getCurrentId();
} catch (\Throwable $e) {
return SYerror($e->getCode(),$e->getMessage());
} //你自己的业务逻辑
好的,大概理解你的意思了,我再调整调整,表示感谢!
市场搜索 《前台api接口,复制即用》 这个一看就懂。 安装必要的包即可!
这样不好吗 我没有在中间件中捕获jwt异常 使用的tinywan/exception-handler 全局捕获
太好了,感谢各位各的一些思路,本人愚钝,还需要消化,也请各位大神们继续盖楼!