记一次laravel和hyperf的JWT认证兼容
背景:现有的一个 laravel10
的API项目,其中一个高频接口需要实时请求第三方接口,基于性能和异步非阻塞的需求,计划将该接口迁移到 hyperf3.1
上,其中用户认证部分用到的是 tymon/jwt-auth
,需要实现 jwt 共用,laravel10 生成的 jwt 在 hyperf 中通过验证。
解决流程:
秉着
不重复制造轮子
的原则,直接利用hyperf现有的权限认证组件。这些组件基本上都是基于 laravel auth 实现的,相信应该可以直接套用。第一次尝试使用 hyperf-ext/jwt 。
发现问题:当前组件并未兼容hyperf3.0+
。
解决办法:放弃使用。换一个组件 96qbhy/hyperf-auth 。
发现问题:一顿操作下来发现未能成功获取 user 。经过调试发现 jwt payload 中用于标记 uid 的字段是uid
, 而tymon/jwt-auth
用的是sub
。详见JwtGuard@user
。
解决办法:放弃使用。hyperf-ext/jwt 的 issues 上发现别人迁移兼容 hyperf3.0 的库 hyperf-extension/jwt 。直接用!
发现问题:继续一顿操作下来获得[ERROR] Token Signature could not be verified.
,接着各种调试排查下来发现是里面对JWT_SECRET
的处理逻辑两边不一样导致。 hyperf-ext/jwt 对JWT_SECRET
额外做了base64_decode
处理。详见ManagerFactory@resolveCodec
。
解决办法:env
配置文件还是使用相同的JWT_SECRET
,config/jwt.php
中对secret
进行base64_encode
.'secret' => base64_encode(env('JWT_SECRET'))
小结:
hyperf 的生态跟 laralvel 比还是差距比较大。(laravel)
推荐文章: