laravel8 JWT的封装

laravel JWT封装

安装JWT composer包:composer require lcobucci/jwt 3.3

创建一个lib目录,在lib目录下创建一个JWT的类,注意:命名空间

// 这些是引入的文件,最后一个好像已经弃用了,但是还能用
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\ValidationData;
// 这是要加密的配置
private static $_config = [
        'audience' => '',//接收人
        'id' => '',//token的唯一标识,这里只是一个简单示例
        'sign' => '',//签名密钥
        'issuer' => '',//签发人
        'expire' => 3600 * 24 //有效期
    ];

编写生成token值的静态方法,方便在控制层中调用

// 获取token,将用户的id或者你要进行加密的数据传参进来
public static function getToken($user_id)
    {
        //签名对象
        $signer = new Sha256();
        //获取当前时间戳
        $time = time();
        //设置签发人、接收人、唯一标识、签发时间、立即生效、过期时间、用户id、签名
        $token = (new Builder())->issuedBy(self::$_config['issuer'])
            ->canOnlyBeUsedBy(self::$_config['audience']) //接收人
            ->identifiedBy(self::$_config['id'], true) // token的表示(唯一)
            ->issuedAt($time) // 签发时间
            ->canOnlyBeUsedAfter($time - 1) // 生效时间
            ->expiresAt($time + self::$_config['expire']) // 有效时间
            ->with('user_id', $user_id) // 用户ID
            ->sign($signer, self::$_config['sign']) // 签名密钥(可以随机字符串)
            ->getToken();
        // 返回token
        return (string)$token;
    }

编写验证token值的静态方法,方便在控制层中调用取回解密后的用户ID

public static function getUserId($token = null)
    {
        $user_id = null;
        $token = empty($token) ? self::getRequestToken() : $token;
        if (!empty($token)) {
            //为了注销token 加以下if判断代码
            $delete_token = cache('delete_token') ?: [];
            if (in_array($token, $delete_token)) {
                //token已被删除(注销)
                return $user_id;
            }
            $token = (new Parser())->parse((string)$token);
            //验证token
            $data = new ValidationData();
            $data->setIssuer(self::$_config['issuer']);//验证的签发人
            $data->setAudience(self::$_config['audience']);//验证的接收人
            $data->setId(self::$_config['id']);//验证token标识
            if (!$token->validate($data)) {
                //token验证失败
                return $user_id;
            }
            //验证签名
            $signer = new Sha256();

            if (!$token->verify($signer, self::$_config['sign'])) {
                //签名验证失败
                return $user_id;
            }
            //从token中获取用户id
            $user_id = $token->getClaim('user_id');
        }
        return $user_id;
    }

在中间中来进行对接口的安全进行防护

// 第一层判断是否抛出一个或多个不需要进行校验Token的接口,注意:一定要是能够保证安全的接口
if (!in_array($request->getPathInfo(), $this->arr)) {
            // 获取Token值,hearder中填写你传输的token的键
            $token = $request->header('token');
            if (empty($token)) {
                return 'token值为空';
            } else {
                try {
                    // 对传输的token进行校验并返回用户的ID
                    $openid = JWT::getUserId($token);
                    if (!$openid) {
                        return 'token有误';
                    }
                } catch (\Exception $e) {
                    return '失败';
                }
            }
        }
        return $next($request);
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3

感觉是不是使用原生的php jwt写个类更靠谱点 毕竟包管理哪里出问题了都不懂

2年前 评论

如果报错Argument 1 passed to Illuminate\Routing\Middleware\ThrottleRequests::addHeaders() must be an instance of Symfony\Component\HttpFoundation\Response, string given, called in D:\ProgramFiles\phpstudy_pro\WWW\laravel8\vendor\laravel\framework\src\Illuminate\Routing\Middleware\ThrottleRequests.php on line 133 出现这个问题是因为中间件中使用了json_encode()函数,解决方法是换成response ()->json(); 在return的时候用return response ()->json($content);

file

2年前 评论

新项目还是用Sanctum吧, 简单方便,一劳永逸

2年前 评论

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