webman 里使用 tinywan/jwt 的一些迷茫

andyzu

在 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 验证有关的,咋总觉得很不优雅?你们都是如何解决的?求大神们指点!

482 6 0
6个回答

shiroi

你要不把webman-admin的middleware的实现看一下得了,正常都是用反射的方式去处理一些免登陆免验权的一些方法

  • andyzu 14天前

    $request->uid = JwtToken::getCurrentId();
    if (0 === $request->uid) {
    throw new UnauthorizedHttpException();
    }

    看过,这个就是 webman-admin 的,不知道找的对不

shanyi

他不是有getCurrentId这个方法嘛,你可以在中间件里面获取用户ID进入身份验证呀

  • andyzu 14天前

    是的,但是还的让前端传过来 userinfo_id , 来进行判断,不知道我的理解对不

  • shanyi 14天前

    不用呀 就是你注册的时候就把用户信息存到Token中呀,前端就正常传这个Toekn呀

  • shanyi 14天前

    就是注册成功下发Toekn这样写: $user = [
    'id' => 1, // 这里必须是一个全局抽象唯一id
    'name' => 'shanyi',
    'email' => 'shanyi@163.com'
    ];
    $token =JwtToken::generateToken($user); 这样就是信息存到Token中了。在中间件用getCurrentId这个就可以获取用户ID了

  • andyzu 14天前

    那也就是说,我不需要判断这个 token 是不是合法,默认认为一切都是 ok的,拿来直接用对吧

  • shanyi 14天前

    就是你这个Token下发的时候就是带着身份信息的,你在中间件验证这个Token 就可以根据用户信息来做验证来检测是否符合你的业务逻辑呀~~

  • shanyi 14天前

    中间件 try {
    // 获取JWT中的用户ID
    $UserId= JwtToken::getCurrentId();
    } catch (\Throwable $e) {
    return SYerror($e->getCode(),$e->getMessage());
    } //你自己的业务逻辑

  • andyzu 14天前

    好的,大概理解你的意思了,我再调整调整,表示感谢!

Tinywan

截图

  • 暂无评论
Carll

市场搜索 《前台api接口,复制即用》 这个一看就懂。 安装必要的包即可!

  • 暂无评论
阿沁

截图
截图
这样不好吗 我没有在中间件中捕获jwt异常 使用的tinywan/exception-handler 全局捕获

  • 暂无评论
lethe

截图

  • andyzu 9天前

    太好了,感谢各位各的一些思路,本人愚钝,还需要消化,也请各位大神们继续盖楼!

×
🔝