ThinkPHP 集成 jwt 技术 token 验证

简介: 本文介绍了在ThinkPHP框架中集成JWT技术进行token验证的流程,包括安装JWT扩展、创建Token服务类、编写中间件进行Token校验、配置路由中间件以及测试Token验证的步骤和代码示例。

一、思路流程

  1. 客户端使用用户名和密码请求登录
  2. 服务端收到请求,验证用户名和密码
  3. 验证成功后,服务端会签发一个token,再把这个token返回给客户端
  4. 客户端收到token后可以把它存储起来,比如放到cookie中
  5. 客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带
  6. 服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据

二、安装 firebase/php-jwt

composer require firebase/php-jwt

三、封装token类

因为我这个是多应用,然后我就只在index应用(只提供api接口)下设置了token类

在这里插入图片描述

<?php
namespace app\index\server;

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

class Token
{

    protected $key;

    public function __construct()
    {
        //从配置信息这种或取唯一字符串,你可以随便写比如md5('token')
        $this->key = 'adcdefg';
    }


    /**
     * 生成token
     * @param $uid
     * @return mixed
     */
    function generateToken($uid)
    {

        //获取当前时间戳
        $currentTime = time();
        $data = array(
            "iss" => $this->key,        //签发者 可以为空
            "aud" => '',             //面象的用户,可以为空
            "iat" => $currentTime,   //签发时间
            "nbf" => $currentTime,   //立马生效
            "exp" => $currentTime + 7200, //token 过期时间 两小时
            "data" => [              //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
                'uid' => $uid,
            ]
        );
        //生成token
        $token = JWT::encode($data, $this->key, "HS256");  //根据参数生成了 token
        return $token;
    }

    /**
     * 校验token时效性
     */
    public function chekToken($token)
    {

        $status=array("code"=>2);
        try {
            JWT::$leeway = 60;//当前时间减去60,把时间留点余地
            $decoded = JWT::decode($token,new Key($this->key,'HS256')); //HS256方式,这里要和签发的时候对应
            $arr = (array)$decoded;
            $res['code']=1;
            $res['data']=$arr['data'];
            return $res;

        } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
            $status['msg']="签名不正确";
            return $status;
        }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
            $status['msg']="token失效";
            return $status;
        }catch(\Firebase\JWT\ExpiredException $e) { // token过期
            $status['msg']="token失效";
            return $status;
        }catch(\Exception $e) { //其他错误
            $status['msg']="未知错误";
            return $status;
        }
    }

}

四、创建中间件,检验Token校验时效性

创建中间件命令:

php think make:middleware CheckToken

在这里插入图片描述

<?php
declare (strict_types = 1);

namespace app\middleware;

class CheckToken
{
   
  /**
     * 处理请求 token 验证
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
  public function handle($request, \Closure $next)
  {
   
    //第一步先取token
    $token = $request->header('token');
    //jwt进行校验token
    $res = (new TokenServer())->chekToken($token);
    if ($res['code'] != 1 ){
   
      return json(['error_code'=>999,'msg'=>$res['msg'],'data'=>''],400);
    }
    $request->uid = $res['data']->uid;
    return $next($request);
  }
}

五、配置路由中间件

在config/middleware.php中注册中间件

在这里插入图片描述

<?php
// 中间件配置
return [
    // 别名或分组
    'alias'    => [
        // 注册中间件
        'check' => [
            app\middleware\CheckToken::class
        ],
    ],
    // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行
    'priority' => [],
];

在app/api/route/route.php路由文件中进行使用,进行使用中间件校验token

在这里插入图片描述

<?php
use think\facade\Route;
// restfull 资源路由
Route::resource('a', 'TestR');

// 路由分组
Route::group('a',function (){
   

})->middleware('check');

六、写几个测试方法,通过postman去验证

<?php
declare (strict_types = 1);

namespace app\index\controller;

use app\index\server\Token as TokenServer;
use think\Request;


use think\annotation\route\Resource;

// 资源控制器
/**
 * @Resource("a")
 */
class TestR
{
   
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index(Request $request)
    {
   
        // 假定用户名为robin和密码为123456即为正确的账号
        if($request->param('uname') == 'robin'&& $request->param('upwd')=='123456')
        {
   
            $uid = $request->param('uname');
            // 设置token
            $token = (new TokenServer())->generateToken($uid);
            $data = ['name' => 'thinkphp', 'status' => '1','token'=>$token];
            // 给前端返回json字符串,同时前端将token获取并且存入到以后的所有操作中
            return show(config("status.success"),"请求成功",$data);
        }else{
   
            return show(config("status.error"),"用户名密码错误",null);
        }

    }

    /**
     * 保存新建的资源
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
    public function save(Request $request)
    {
   
        // 用update 来验证一下token
        $token = $request->param('token');
        $rs = checkToken($token);
        return json($rs);
    }

  // ....
}
  1. 模拟登录测试

在这里插入图片描述

  1. 模拟前端携带token参数访问
    在这里插入图片描述
相关文章
|
2月前
|
JSON 安全 算法
|
1月前
|
前端开发 JavaScript 测试技术
前端测试技术中,如何提高集成测试的效率?
前端测试技术中,如何提高集成测试的效率?
|
17天前
|
机器学习/深度学习 自然语言处理 监控
智能客服系统集成技术解析和价值点梳理
在 2024 年的智能客服系统领域,合力亿捷等服务商凭借其卓越的技术实力引领潮流,它们均积极应用最新的大模型技术,推动智能客服的进步。
52 7
|
1月前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
152 1
|
1月前
|
安全 测试技术 数据安全/隐私保护
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
|
3月前
|
JSON 安全 数据安全/隐私保护
从0到1搭建权限管理系统系列三 .net8 JWT创建Token并使用
【9月更文挑战第22天】在.NET 8中,从零开始搭建权限管理系统并使用JWT(JSON Web Tokens)创建Token是关键步骤。JWT是一种开放标准(RFC 7519),用于安全传输信息,由头部、载荷和签名三部分组成。首先需安装`Microsoft.AspNetCore.Authentication.JwtBearer`包,并在`Program.cs`中配置JWT服务。接着,创建一个静态方法`GenerateToken`生成包含用户名和角色的Token。最后,在控制器中使用`[Authorize]`属性验证和解析Token,从而实现身份验证和授权功能。
238 3
|
2月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
26天前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
49 0
|
5月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
318 6
|
5月前
|
Java 关系型数据库 MySQL
如何实现Springboot+camunda+mysql的集成
【7月更文挑战第2天】集成Spring Boot、Camunda和MySQL的简要步骤: 1. 初始化Spring Boot项目,添加Camunda和MySQL驱动依赖。 2. 配置`application.properties`,包括数据库URL、用户名和密码。 3. 设置Camunda引擎属性,指定数据源。 4. 引入流程定义文件(如`.bpmn`)。 5. 创建服务处理流程操作,创建控制器接收请求。 6. Camunda自动在数据库创建表结构。 7. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
421 4

热门文章

最新文章