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);
推荐文章: