您的当前位置:首页>全部文章>文章详情

【PHP】ThinkPHP 集成 jwt 技术 token 验证

CrazyPanda发表于:2024-08-08 18:45:49浏览:275次TAG: #php #jwt #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参数访问
    在这里插入图片描述

猜你喜欢

【PHP】thinkphp用db还是模型
在使用thinkphp框架进行开发时,开发者常常会面临一个选择:使用数据库操作(db)还是模型(model)。数据库操作是直接对数据库进行操作,可以直接写SQL语句,操作更加灵活。模型则是通过封装操作数据库,提供了更加便于使用的增删改查方法。那么,究竟该选择使用哪种方式呢?下面就让我们来探讨一下。一、使用数据库操作1.优点(1)灵活:使用数据库操作可以灵活地编写SQL语句,可以通过拼接字符串等方式完成各种复杂的查询操作。(2)效率高:数据库操作直接面向数据库,执行起来速度比较快。(3)适用面广:
发表于:2024-03-15 浏览:311 TAG:
【PHP】PHP实现图片验证码的生成和验证
PHP实现图片验证码的生成和验证在网站开发中,为了防止机器恶意攻击或者自动注册,我们经常会使用图片验证码来进行验证。本文将介绍如何使用PHP来生成和验证图片验证码,并给出具体的代码示例。生成图片验证码生成图片验证码的关键是生成随机的验证码字符串,并将其绘制到图片上。以下是一个生成图片验证码的示例代码:&lt;?php session_start(); &nbsp; //&nbsp;声明图片尺寸 $image_width&nbsp;=&nbsp;100; $image_height&amp;nb
发表于:2023-12-28 浏览:288 TAG:
【PHP】TP6 Think-Swoole构建的RPC服务与微服务架构
引言:随着互联网的快速发展以及业务规模的扩大,传统的单体架构已经无法满足大规模业务场景的需求。因此,微服务架构应运而生。在微服务架构中,RPC(Remote Procedure Call)服务是实现服务间通信的一种重要方式。通过RPC服务,各个微服务之间可以方便、高效地互相调用。在本篇文章中,我们将介绍如何使用Think-Swoole框架构建RPC服务,实现微服务架构中的服务间通信,并提供具体的代码示例。一、TP6 Think-Swoole简介TP6 Think-Swoole是一个基于Think
发表于:2024-05-27 浏览:254 TAG:
【PHP】php使用curl常见出错
hp是一款广泛应用于服务器端开发的编程语言。在常见的web应用程序中,php常使用curl库实现http请求,主要用于与其他web服务进行通信。然而,在使用curl时,开发人员可能会遇到各种问题,其中最常见的问题是curl在发送请求时出错。cURL错误通常会导致请求无法正常发送或无法成功获取响应。本文将介绍cURL的常见错误以及如何解决这些问题。一、未安装cURL扩展在使用cURL前,首先需要在PHP中安装cURL扩展,否则cURL库将无法正常工作,在发送请求时会抛出错误。要检查PHP是否已经
发表于:2024-03-19 浏览:296 TAG:
【PHP】php哪些函数可以用来去幂方值
php可以用来去幂方值的函数有pow函数、双星号、exp函数、sqrt函数和log函数等。详细介绍:1、pow函数用于计算x的y次幂,x是底数,y是指数;2、双星号是幂运算符,用于计算一个数的幂;3、exp函数用于计算以e为底的x次幂,e是自然对数的底数,x是指数;4、sqrt函数用于计算一个数的平方根,x是计算平方根的数;5、log函数用于计算以指定底数为底的对数。本教程操作系统:windows10系统、PHP 8.1.3版本、DELL G3电脑。在PHP中,可以使用一些内置的函数来
发表于:2023-12-28 浏览:249 TAG:
【PHP】php如何去掉数组内重复元素
php去掉数组内重复元素的方法:1、使用“array_unique()”函数,去除数组中的重复数据;2、通过foreach循环遍历,通过定义一个新的数组存储不重复的数据的方法实现去重;3、使用array_flip()和array_keys()函数,可得到去重后的数组;4、使用array_filter()函数,通过使用该函数结合匿名函数的方式对原始数组进行去重。本教程操作系统:Windows10系统、PHP8.1.3版、Dell G3电脑php去除数组内重复元素的方法方法一:使用arra
发表于:2023-12-20 浏览:329 TAG:
【PHP】自学php需要考哪些证
自学php需要考的证书有Zend PHP Certification、PHP Developer Certification、W3School PHP Certification、O&#39;Reilly Media PHP Certification、Sap PHP Certification等等。详细介绍:1、Zend PHP Certification,是一种权威的认证证书等等。本教程操作系统:windows10系统、PHP8.1.3版本、Dell G3电脑。PHP作为一种开源的
发表于:2023-12-06 浏览:376 TAG:
【PHP】PHP8.1新特性大讲解之Fibers with a grain of salt
Fibers with a grain of salt所以我打算写一篇关于在PHP 8.1 中使用Fibers纤维的深入博客文章。我们将从一个基本示例开始,从头开始解释它们。这个想法是发送异步 HTTP 请求并使用纤程并行处理它们。但是和他们一起玩,我了解到RFC并不是在开玩笑,当它说“不应直接在应用程序级代码中使用 Fiber API。Fibers 提供了一个基本的、低级的流控制 API 来创建更高然后在应用程序代码中使用的级抽象”。因此,与其走这条路并使事情变得过于复杂,我们将讨论什么是纤程
发表于:2024-01-04 浏览:293 TAG:
【PHP】php amr格式转化mp3
在音频文件处理中,有时候我们需要将AMR格式的音频文件转换成MP3格式。本文将介绍如何使用PHP语言来完成AMR格式转化MP3。一、AMR格式简介AMR全称 Adaptive Multi-Rate,是一种压缩音频格式。由于AMR格式文件体积小,网络传输速度快,因此被广泛应用于手机铃声、语音留言、移动通讯等领域。二、MP3格式简介MP3全称 MPEG Audio Layer-3,是一种常用的音频格式。由于MP3格式具有音质高、可压缩、体积小等特点,因此被广泛应用于音乐播放器、电影播放器等
发表于:2023-12-20 浏览:270 TAG:
【PHP】设计模式的六大原则
设计模式的六大原则是指导软件开发设计的核心原则,它们帮助开发人员创建可维护、可扩展和灵活的软件系统。这些原则包括:&nbsp;‌&nbsp;&nbsp;&nbsp;&nbsp;单一职责原则(Single Responsibility Principle, SRP):一个类应该只有一个引起它变化的原因。这有助于减少类与类之间的耦合,提高类的内聚性和可读性。&nbsp;‌&nbsp;&nbsp;&nbsp;&nbsp;开闭原则(Open-Closed Principle, OCP):软件实体(如类、
发表于:2024-07-16 浏览:271 TAG: