记一次laravel和hyperf的JWT认证兼容

背景:现有的一个 laravel10 的API项目,其中一个高频接口需要实时请求第三方接口,基于性能和异步非阻塞的需求,计划将该接口迁移到 hyperf3.1 上,其中用户认证部分用到的是 tymon/jwt-auth ,需要实现 jwt 共用,laravel10 生成的 jwt 在 hyperf 中通过验证。

解决流程:

  1. 秉着不重复制造轮子的原则,直接利用hyperf现有的权限认证组件。这些组件基本上都是基于 laravel auth 实现的,相信应该可以直接套用。

  2. 第一次尝试使用 hyperf-ext/jwt
    发现问题:当前组件并未兼容 hyperf3.0+
    解决办法:放弃使用。

  3. 换一个组件 96qbhy/hyperf-auth
    发现问题:一顿操作下来发现未能成功获取 user 。经过调试发现 jwt payload 中用于标记 uid 的字段是 uid , 而 tymon/jwt-auth 用的是 sub。详见 JwtGuard@user
    解决办法:放弃使用。

  4. hyperf-ext/jwt 的 issues 上发现别人迁移兼容 hyperf3.0 的库 hyperf-extension/jwt 。直接用!
    发现问题:继续一顿操作下来获得 [ERROR] Token Signature could not be verified. ,接着各种调试排查下来发现是里面对 JWT_SECRET 的处理逻辑两边不一样导致。 hyperf-ext/jwtJWT_SECRET 额外做了 base64_decode 处理。详见 ManagerFactory@resolveCodec
    解决办法:env 配置文件还是使用相同的 JWT_SECRETconfig/jwt.php 中对 secret 进行 base64_encode.

    'secret' => base64_encode(env('JWT_SECRET'))

    小结:
    hyperf 的生态跟 laralvel 比还是差距比较大。(laravel :cow: :beer:)

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

我们以前也是这么做的

4周前 评论
kwok_wah (楼主) 4周前

要是能无缝使用,就太炸裂了。不过还好迁移不难

4周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!