JWT Token 的生成及解密


一、登录流程?

前端发送请求 -> 后端验证通过后签发 Token -> 前端存入token,在请求其他接口是将token带入header头中

二、使用步骤

1.引入 jwt 库

安装:

composer require firebase/php-jwt

依赖composer,通过 cmd 进入项目根目录 或者 项目终端 安装:

检查项目vendor文件中生成了以下文件就代表安装成功

引入: 

 use Firebase\JWT\JWT;       

2.生成 token

代码:

    public function loginpwd($username, $password)
    {
        $password = md5($password);
        $loginpwd = new user();
        $checkuser = $loginpwd->checkuser($username, $password);
        if ($checkuser['code'] == 0) { 
            return json($checkuser);
        } else if ($checkuser['code'] == 1) { 
            $key = 'adminTokenpwd';
            $token = array(
                "iat" => time(),
                "nbf" => time(),
                "exp" => time() + 60 * 60 * 24 * 7,
                "uid" => $checkuser['id']
            );
            $jwt = JWT::encode($token, $key, "HS256");
            return json(['code' => 1, 'msg' => '登陆成功', 'token' => $jwt]);
        } else { 
            return json($checkuser);
        }
    }

 核心:

               $key = 'adminTokenpwd';                 //自定义key,必须与验证token中的key一致

               $token = array(

               "iat" => time(),                    // jwt的签发时间

               "nbf" => time(),                    //定义在某个时间前 jwt 是不可用的

               "exp" => time() + 60 * 60 * 24 * 7,   // jwt 的过期时间(大于签发时间),规则:秒*分*时*天

               "uid" => $checkuser['id']           // 自定义的数据:这里我带了用户id

            );

               $jwt = JWT::encode($token, $key, "HS256");      //调用方法

 返回数据格式:

3.解密 token

我是在控制器中单独创建的一个Token文件,也可以放在中间件。

这里我继承的BaseController ,其他接口文件直接继承Token

引入:

use Exception;
use Throwable;
use Firebase\JWT\JWT;
use app\BaseController;
use Firebase\JWT\ExpiredException;
use Firebase\JWT\BeforeValidException;
use Firebase\JWT\SignatureInvalidException;

验证方法:

class Token extends BaseController
{
    /**
     * Token验证
     */
    // 验证 token
    protected function initialize()
    {
        parent::initialize();
        $header = request()->header();
        if (!isset($header['token']) || $header['token'] == null) {
            echo json(['code' => 0, 'msg' => 'token不能为空'], 400)->send();
            die();
        }
        $token = $header['token'];
        
        $key = 'adminTokenpwd'; // 解密token,key必须与签发token中的key一致
        try {
            $info = JWT::decode($token, $key, ['HS256']);
            $this->uid = $info->uid;
        } catch (SignatureInvalidException $e) { //签名不正确
            echo json(['code' => 0, 'status' => $e->getCode(), 'msg' => '签名不正确'], 400)->send();
            die();
        } catch (BeforeValidException $e) { // 签名在某个时间点之后才能用
            echo json(['code' => 1, 'status' => $e->getCode(), 'msg' => '账号未到可用时间'], 400)->send();
            die();
        } catch (ExpiredException $e) { // token过期
            echo json(['code' => 2, 'status' => $e->getCode(), 'msg' => '登录状态过期'], 400)->send();
            die();
        } catch (Exception $e) { //其他错误
            echo json(['code' => 3, 'status' => $e->getCode(), 'msg' => '非法操作'], 400)->send();
            die();
        } catch (Throwable $e) {
            echo json(['code' => 3, 'status' => $e->getCode(), 'msg' => '非法操作'], 400)->send();
            die();
        }
    }
}

总结

团结就是力量,分享是温故知新

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输声明。JWT通常用于身份验证和授权。JWT由三部分组成:头部、载荷和签名。 1. 头部(Header):JWT头部通常由两部分组成:令牌的类型(即JWT)和采用的签名算法,如下所示: ``` { "alg": "HS256", "typ": "JWT" } ``` 其中,alg表示所采用的算法,如HS256表示HMAC SHA-256,而typ表示令牌的类型,即JWT。 2. 载荷(Payload):载荷是JWT的第二部分,也就是存放有效信息的地方。JWT的载荷是一个JSON对象,其中包含了一些声明,如下所示: ``` { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } ``` 其中,sub表示主题(subject),即JWT所代表的实体;name表示实体的名称;iat表示JWT的签发时间(issued at)。 3. 签名(Signature):签名是JWT的第三部分,用于验证消息的完整性。JWT的签名通常使用HMAC算法或RSA公私钥对,具体方法如下: - 使用Base64编码头部(Header)和载荷(Payload)。 - 将编码后的头部和载荷用.连接起来,生成一个字符串。 - 使用密钥对该字符串进行签名。 - 将签名和原始字符串用.连接起来,生成最终的JWTJWT的加密和解密过程如下: 1. JWT生成过程: - 构造头部(Header)和载荷(Payload)。 - 使用Base64编码头部和载荷,然后将它们用.连接起来,生成一个字符串。 - 使用密钥对该字符串进行签名,生成签名(Signature)。 - 将签名和原始字符串用.连接起来,生成最终的JWT。 2. JWT的验证过程: - 从JWT中分离出头部、载荷和签名。 - 使用Base64解码头部和载荷,然后将它们用.连接起来,生成一个字符串。 - 使用密钥对该字符串进行签名,生成签名。 - 将生成的签名和JWT中的签名进行比较,如果相同,则说明JWT有效,否则说明JWT无效或被篡改。 需要注意的是,JWT的安全性取决于密钥的保密性。如果密钥泄露,那么攻击者就可以轻松地伪造JWT。因此,必须确保密钥的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值