在 ThinkPHP 中使用 JWT 签发 Token

一、什么是 JWT

JWT,全称:Json Web Token,可以看成是一种 Token 签发方案。

Token 通常叫做认证令牌,用于客户端和服务端在交互时的身份认证。

JWT 的优势:

  1. 数据量小,传输速度快。
  2. 使用 json 数据格式,可跨语言。
  3. 即签即发,不需要在服务端保存。
  4. 适合移动端。

更多关于 JWT 的信息可访问官网查看 >>>

二、在 ThinkPHP 中安装 JWT

先去官网挑选适合自己项目的库。

进入官网,选择 Libraries ,选择 PHP 语言过滤。

在这里插入图片描述

每个库都有对应的 composer 命令。

这里选择第一个,在 ThinkPHP 项目根目录下执行命令安装:

composer require firebase/php-jwt

三、签发 Token 示例

public function createToken()
{
   
   
    $jwtContent = [
    	// 签发人,这里采用当前站点域名
        'iss' => request()->domain(),
        // 签发时间,当前时间戳
        'iat' => time(),
        // 到期时间,1天后
        'exp' => time(
### ThinkPHPJWT使用详解及实现机制 #### 一、JWT 基本概念 JSON Web Token (JWT) 是一种开放标准 (RFC 7519),用于在网络应用环境间安全地传输信息。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。通过加密算法生成的签名来验证数据的真实性和完整性。 在 PHP 开发中,通常会借助第三方库 `firebase/php-jwt` 来简化 JWT 的创建与校验过程[^1]。 --- #### 二、ThinkPHPJWT 的基本操作 ##### 1. 安装依赖 要使用 JWT 功能,需先安装 Firebase 提供的 php-jwt 库: ```bash composer require firebase/php-jwt ``` ##### 2. 创建与编码 JWT 以下是基于 ThinkPHP 和 `firebase/php-jwt` 的示例代码: ```php <?php use \Firebase\JWT\JWT; $key = "example_key"; // 密钥,建议设置为复杂字符串并存储于配置文件中 $payload = [ "iss" => "http://example.org", // 发行人 "aud" => "http://example.com", // 接收方 "iat" => time(), // 当前时间戳 "exp" => time() + 3600 // 过期时间 ]; // 编码 token $jwt = JWT::encode($payload, $key, 'HS256'); echo "Generated JWT: {$jwt}\n"; ?> ``` 此代码片段展示了如何利用私有密钥 `$key` 对负载 `$payload` 进行编码,并生成一个符合 HS256 加密算法的 JWT 字符串[^1]。 ##### 3. 解析与验证 JWT 当客户端携带该令牌请求服务端资源时,服务器需要对其进行解析与验证: ```php <?php try { $decoded = JWT::decode($jwt, $key, ['HS256']); // 将对象转换成数组形式以便后续处理 $decoded_array = (array)$decoded; print_r($decoded_array); } catch (\Exception $e) { echo "Error decoding jwt: ", $e->getMessage(); } ?> ``` 如果解码失败,则抛出异常;成功则返回原始 payload 数据结构[^1]。 --- #### 三、ThinkPHP 配合中间件完成 Token 认证流程 为了增强安全性,在实际项目开发过程中推荐引入 **中间件** 实现自动化的身份认证逻辑。下面是一个简单的例子说明如何结合 ThinkPHP 构建这样的功能[^2]: ##### 1. 自定义签发函数 首先编写工具类中的 signToken 方法用来封装用户的敏感资料至 token 内部: ```php function signToken(array $userData): string{ $configKey = config('app.jwt_secret'); // 获取全局配置项作为 secret key return JWT::encode([ 'uid'=>$userData['id'], // 用户唯一标识符 'username'=>$userData['username'] // 可选字段... ],$configKey,'HS256'); } ``` ##### 2. 登录接口调用 模拟微信登录场景下生成 token 并反馈给前端开发者测试使用: ```php public function wxLogin(){ $userInfo=['id'=>rand(1,10),'username'=>'testUser'.mt_rand()]; $token=signToken($userInfo); return json(['status'=>true,'message'=>"login success",'data'=>['access_token'=>$token]]); } ``` ##### 3. 添加自定义中间件 新建名为 AuthMiddleware.php 文件位于 application/middleware/ 下面定义拦截器行为: ```php namespace app\middleware; class JwtAuth { protected static $_instance=null; private $__construct(){} public static getInstance(){ if(is_null(self::$_instance)){ self::$_instance=new self(); } return self::$_instance; } /** * Handle an incoming request. * * @param RequestInterface $request * @param Closure $next */ public function handle($request,$next){ try{ $bearer=$request->header('Authorization',''); list($_type,$_token)=explode(' ',$bearer); if(empty($_token)||strtolower(trim($_type))!=='bearer'){ throw new Exception("Invalid authorization header format."); } global $_SERVER; parse_str(parse_url($_SERVER["REQUEST_URI"],PHP_URL_QUERY),$queryParameters); unset($queryParameters['timestamp'],$queryParameters['signature']); ksort($queryParameters,SORT_STRING|SORT_FLAG_CASE); $stringToSign=http_build_query($queryParameters).'&'.$_token; define('__SIGNATURE__',hash_hmac('sha256',trim($stringToSign),config('app.jwt_secret'))); if(!isset($GLOBALS['__DECODED_TOKEN__'])){ $GLOBALS['__DECODED_TOKEN__']=JWT::decode($_token,config('app.jwt_secret'),['HS256']); foreach ($GLOBALS['__DECODED_TOKEN__']->getHeaders() as &$value){ setcookie(str_replace('-','',mb_convert_case($value,true)),null,-1,"/"); } } $request->bind('authInfo',(array)$GLOBALS['__DECODED_TOKEN__']); }catch(\Throwable $th){ abort(401,['error'=>$th->getMessage()]); } return $next($request); } } ``` 最后记得注册这个新的 middleware 到框架的核心路由管理器里面去生效即可[^2]. --- #### 四、总结 本文介绍了 JSON Web Tokens 在 ThinkPHP 框架下的具体实践方式及其背后的工作原理。从基础的概念出发逐步深入探讨了包括但不限于以下几个方面的重要知识点: - 如何正确构建以及消费 JWT; - 结合业务需求设计合理的 API 路径保护策略; - 使用成熟的开源组件降低重复造轮子的风险成本。 希望以上内容能够帮助读者更好地理解并掌握这一关键技术手段的应用技巧! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

相逢不晚何必匆匆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值