当前位置:首页 > 编程技术 > 正文内容

jwt 小程序接口鉴权 【firebase 6.x】

yc8881年前 (2022-12-15)编程技术414

jwt 小程序接口鉴权 【firebase 6.x】

1. 前言


firebase/php-jwt 是一个非常简单的 JWT 库,用于在 PHP 中对 JSON Web令牌(JWT)进行编码和解码

packagist 上的下载次数更是达到了 1亿 以上,可见该扩展包受欢迎的程度

本文记录使用 ThinkPHP6.0 开发微信小程序接口时如何使用 JWT 做的接口鉴权

composer create-project topthink/think:"6.0.*"cd thinkcomposer require firebase/php-jwt:"6.x"

观看本文前首先要明白一个概念: TP6.0 中控制器的构造方法、控制器中间件的执行顺序

控制器构造方法 > 控制器中间件 > 控制器方法

2. 过期时间


\Firebase\JWT\JWT::decode() 方法中,可以发现以下代码

当 $payload 中有 exp  属性时,则判断 token 是否过期

当 $payload 中没有传入 exp  属性时,则 token 可以永久使用

// Check if this token has expired.if (isset($payload->exp) && ($timestamp - static::$leeway) >= $payload->exp) {    throw new ExpiredException('Expired token');}

3. 代码示例


公共基础控制器构造方法 Base.php

protected $middleware = [JwtMiddleware::class];public function __construct(Request $request){    $token = $request->header('token');    if (empty($token)) {        $request->uid = 0;    } else {        $request->uid = JwtAuth::decode($token);    }}

创建中间件 JwtMiddleware.php

public function handle($request, \Closure $next){    // 因为构造方法优先于控制器中间件执行    // 如果 $request->uid 已存在,代表已在构造方法中获取了用户id,无需再次对token解密    if (!empty($request->uid)) {        return $next($request);    }    // 执行到此代表请求头中的 token 为空    throw new \Exception('请先登录');    // 继续执行请求    return $next($request);}

Jwt 功能封装类 JwtAuth.php

<?phpdeclare(strict_types=1);namespace app\lib;use Firebase\JWT\JWT;use Firebase\JWT\Key;class JwtAuth{    // 访问密钥    const KEY = 'ed6a18a9a';    // 签发者    const ISS = 'liang';    // 接收者    const AUD = 'www.itqaq.com';    // 加密算法 The signing algorithm    const ALG = 'HS256';    /**     * 对数据进行编码     *     * @param integer $uid     */    public static function encode(int $uid)    {        $time = time();        $payload = [            "iss"  => self::KEY,            "aud"  => self::KEY,            "iat"  => $time,            "nbf"  => $time,            'exp'  => $time + 86400 * 30,            'data' => ['uid' => $uid],        ];        $token = JWT::encode($payload, self::KEY, self::ALG);        return $token;    }    /**     * 对 token 进行编码     *     * @param string  $token     * @param integer $user_id     */    public static function decode(string $token)    {        try {            // 对 token 进行编码            $decoded = JWT::decode($token, new Key(self::KEY, self::ALG));            // 检测 token 附加数据中是否存在用户id            if (isset($decoded->data->uid) && $decoded->data->uid > 0) {                $user_id = intval($decoded->data->uid);            } else {                throw new \Exception('token 中没有用户id');            }        } catch (\Exception $e) {            throw new \Exception($e->getMessage(), 201);        }        return $user_id; // 用户id    }}

4. 使用说明


通过上面代码可以看到基础控制器 Base.php 中定义了控制器中间件,需要登录状态校验的控制器要继承 Base 控制器即可

场景一: 控制器中的所有方法都要进行登录状态校验,也就是只有登录了才能访问,则直接继承即可

use app\Request;class User extends Base{    public function getProfile(Request $request)    {        $request->uid; // 用户id    }}

场景二: 控制器中一部分方法必须登录了才能访问,一部分方法有没有登录都可以访问

此时需要继承 Base 控制器,并且重写 $middleware 属性

有没有登录都能访问的方法使用 except 指定即可,此时 $request->uid 值为 0 或 用户id

use app\Request;class User extends Base{    protected $middleware = [        JwtMiddleware::class => [            // getLists 方法不执行中间件            'except' => ['getLists'],        ],    ];    /**     * 有没有登录都可以访问     *     * @param Request $request     */    public function getLists(Request $request)    {        $request->uid<span class="pun"

本站发布的内容若侵犯到您的权益,请邮件联系站长删除,我们将及时处理!


从您进入本站开始,已表示您已同意接受本站【免责声明】中的一切条款!


本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行研究。


本站资源仅供学习和交流使用,版权归原作者所有,请勿商业运营、违法使用和传播!请在下载后24小时之内自觉删除。


若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,使用者自行承担,概与本站无关。


本文链接:https://www.10zhan.com/biancheng/10225.html

标签: 软件编程
分享给朋友:

“jwt 小程序接口鉴权 【firebase 6.x】” 的相关文章

【说站】Thymeleaf报错Error resolving template “XXX”

【说站】Thymeleaf报错Error resolving template “XXX”

修改了一下开源项目的目录结构访问突然报错Error resolving template “XXX”可能原因有如下三种:第一种可能:原因:在使用springboot的过程中,如果使用thymeleaf...

【说站】用一句话就可以去除宝塔面板操作上的二次验证

【说站】用一句话就可以去除宝塔面板操作上的二次验证

用过宝塔的朋友应该都会发现,现在宝塔面板有些鸡肋的功能,删除文件、删除数据库、删除站点等操作都需要做计算题!不仅加了几秒的延时等待,还无法跳过!这时候就会有朋友在想,如何去除宝塔面板的二次验证,此篇文...

【说站】利用Webhook实现Java项目自动化部署

【说站】利用Webhook实现Java项目自动化部署

用webhook就能实现Java项目自动部署,其实原理很简单。费话不多说,直接往下看教程。1. 创建gitee仓库并初始化2. 在linux安装git3. 在宝塔的软件的商店里下载Webhook4....

【说站】电脑安装MySQL时出现starting the server失败原因及解决方案

【说站】电脑安装MySQL时出现starting the server失败原因及解决方案

今天在安装MySQL时出现starting the server失败,经过查询分析得出以下结论,记录一下操作步骤。原因分析:如果电脑是第一次安装MySQL,一般不会出现这样的报错。如下图所示。star...

【说站】Java从resources读取文件内容的方法有哪些

【说站】Java从resources读取文件内容的方法有哪些

本文主要介绍的是java读取resource目录下文件的方法,比如这是你的src目录的结构├── main│ ├── java│ │ └── ...

【说站】linux中redis如何以redis用户重启?

【说站】linux中redis如何以redis用户重启?

通过上图我们可以看到,目前状态是已经以 redis 用户启动着,我想修改下 redis 的密码,然后怎么以 redis 用户重启呢?redis 是 nologin 用户,不能通过 su redis 切...