美文网首页收藏web前端开发
关于JWT的一些个人看法

关于JWT的一些个人看法

作者: gao922699 | 来源:发表于2022-07-21 09:35 被阅读0次

JWT(JSON WEB TOKEN)是一种无状态的token机制,可以用来进行前后端交互的用户认证,或者接口鉴权。

主要优势

  • 无状态

加密解密过程无需操作数据库或者缓存,是一个无状态的过程,执行效率高,而且可以在不同系统中传递,实现单点登录功能(需要各个系统的key一致)。

  • 主要缺点

    1. 登录状态续签

token有效期即将到期后无法自动续签,可以前端处理获取到的token有效期快过的时候再请求一个新的token,不过也无法保障永续。

  1. 旧的token无法注销

获取到新的token后,只要旧的token没有过期,还可以继续使用。解决办法有用户注销时把旧的token加黑名单等,但是这样就破坏了它本身无状态的优势,每次验证都要访问缓存。

token组成

header.payload.sign

  • header中包含了加密算法等信息,payload包含有效载荷信息,sign是签名;

  • payload一般需要包含expired_time、refresh_time等信息,还有自定义的信息

  • 加密解密算法可用的封装:composer require firebase/php-jwt

token验证逻辑实现:

<?php

namespace App\Http\Middleware;

use Closure;
use Firebase\JWT\JWT;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;

/**
 * jwt验证中间件
 * Class CheckJwtToken
 * @package App\Http\Middleware
 */
class CheckJwtToken
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $token = $request->bearerToken();
        if (!$token) {
            throw new UnauthorizedHttpException('','JWT TOKEN AUTH FAILED');
        }
        $payload = JWT::decode($token, getenv('JWT_SECRET'), ['HS256']);
        if (isset($payload->expired_at) && $payload->expired_at < time()) {
            throw new UnauthorizedHttpException('','JWT TOKEN AUTH FAILED');
        }
        //验证通过,可以使用payload中的信息了
        ......
    }
}

如果需要refresh的功能,可以参考这篇文章:

https://segmentfault.com/a/1190000013151506

相关文章

网友评论

    本文标题:关于JWT的一些个人看法

    本文链接:https://www.haomeiwen.com/subject/mdeeirtx.html