当前位置:

首页 > 编程开发 > 使用ThinkPHP6实现JWT认证的方法详情

使用ThinkPHP6实现JWT认证的方法详情

JWT(JSONWebToken)是一种轻量级的认证和授权机制,它使用JSON对象作为安全令牌,可以在多个系统之间安全地传输用户身份信息。而ThinkPHP6是一种基于PHP语言的高效、灵活的MVC框架,它提供了许多有用的工具和功能,其中就包括JWT认证机制。在本文中,我们将介绍如何使用ThinkPHP6进行JWT认证,以保障Web应用程序的安全性和可靠

JWT(JSON Web Token)是一种轻量级的认证和授权机制,它使用JSON对象作为安全令牌,可以在多个系统之间安全地传输用户身份信息。而ThinkPHP6是一种基于PHP语言的高效、灵活的MVC框架,它提供了许多有用的工具和功能,其中就包括JWT认证机制。在本文中,我们将介绍如何使用ThinkPHP6进行JWT认证,以保障Web应用程序的安全性和可靠性。

  1. 安装和配置JWT扩展

首先,我们需要在我们的应用程序中安装JWT扩展。可以通过在composer.json文件中添加依赖项来安装它:

{
    "require": {
        "firebase/php-jwt": "^5.0.0"
    }
}

然后运行以下命令安装它:

composer install

安装完成后,我们需要在配置文件中配置JWT。在config目录下创建jwt.php文件,并添加以下内容:

 'your-secret-key',
    'alg' => 'HS256',
    'exp' => 7200, // token过期时间,单位秒
];

其中“key”是一个字符串,用于生成JWT令牌的签名密钥,“alg”是JWT签名算法的名称,我们可以选择“HS256”、“HS512”、“RS256”等算法,“exp”是JWT令牌的过期时间,按秒数计算。

  1. 实现JWT认证控制器

接下来,我们需要创建一个JWT认证控制器,实现JWT认证。在app/controller目录下创建AuthController.php文件,并添加以下内容:

 $user->id, // 存储用户ID
            'exp' => time() + config('jwt.exp'), // 设定过期时间
        ];
        $jwt = JWT::encode($payload, $secretKey, $alg); // 生成JWT令牌
        return ['token' => $jwt]; // 返回JWT Token给客户端
    }

    public function dashboard()
    {
        //检查请求中的JWTToken是否有效,并返回用户信息

        $jwtToken = request()->header('Authorization'); // 获取JWT Token
        if (!$jwtToken) {
            // 如果token不存在,直接返回错误信息
            return ['msg' => '未验证身份,请先登录'];
        }
        $jwtInfo = JWT::decode($jwtToken, config('jwt.key'), [config('jwt.alg')]); // 使用JWT解密Token
        $userId = $jwtInfo->sub; // 获取token中存储的用户ID,用来查询用户信息
        $user = Db::table('users')->where('id', $userId)->find(); // 查询用户信息
        if (!$user) {
            // 用户不存在,直接返回错误信息
            return ['msg' => '用户不存在'];
        }
        // 返回用户信息
        return ['username' => $user['username'], 'email' => $user['email']];
    }
}

在上面的控制器代码中,我们实现了两个功能:一个是用户登陆,另一个是获取用户信息。在登陆过程中,我们生成了一个JWT令牌,并将其返回给客户端,用于后续请求中的身份验证。在dashboard方法中,我们检查了请求的Authorization头中是否包含JWT令牌,并使用JWT解密令牌,验证用户的身份是否有效。

  1. 添加JWT认证中间件

最后,我们需要在应用程序中添加一个JWT认证中间件,以保护需要认证的API接口。在app/middleware目录中创建JwtAuth.php文件,并添加以下内容:

header('Authorization'); // 获取JWT Token
        if (!$jwtToken) {
            // 如果token不存在,直接返回错误信息
            return response(['msg' => '未授权的API请求!'], 401);
        }
        try {
            $jwtInfo = JWT::decode($jwtToken, Config::get('jwt.key'), [Config::get('jwt.alg')]); // 使用JWT解密Token
            $request->jwtInfo = $jwtInfo; // 将解密后的JWT信息存储在请求对象中,后续控制器可以使用
            return $next($request); // 继续后续请求处理
        } catch (Exception $e) {
            // JWT Token过期或者解密失败,返回错误信息
            return response(['msg' => 'JWT Token无效或已过期!'], 401);
        }
    }
}

在上面的代码中,我们检查了请求的Authorization头中是否包含有效的JWT令牌。如果JWT令牌无效或者已过期,我们返回一个未授权的HTTP响应,否则我们继续后续请求处理,并将JWT令牌的信息存储在请求对象中,以供后续控制器使用。

最后,我们需要在应用程序的路由中使用JWT认证中间件来保护需要认证的API接口。例如,我们在routes/api.php文件中添加以下代码:

middleware(JwtAuth::class);

在上面的代码中,我们将dashboard方法使用JwtAuth中间件进行了保护,确保只有带有有效JWT令牌的请求才能访问它。

结论

在本文中,我们介绍了如何使用ThinkPHP6进行JWT认证,以保障Web应用程序的安全性和可靠性。我们首先安装和配置了JWT扩展,然后实现了JWT认证控制器和JWT认证中间件,最后在应用程序的路由中使用JWT认证中间件来保护需要认证的API接口。通过这些步骤,我们可以在ThinkPHP6应用程序中轻松实现JWT认证机制,确保Web应用程序的安全性和可靠性。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 thinkphp
相关文章 更多
thinkphp项目部署指南详解服务器部署步骤
thinkphp项目部署指南详解服务器部署步骤

详细解析ThinkPHP项目在Linux服务器上的部署步骤,包括环境搭建、文件权限、Nginx配置及常见陷阱,提供可复制的代码示例与例外场景分析。

为什么 TP6.0 模型关联为空?with 预加载与查询作用域的使用【ORM】
为什么 TP6.0 模型关联为空?with 预加载与查询作用域的使用【ORM】

ThinkPHP6.0模型关联返回null的常见原因包括:with闭包遗漏外键和主键字段、嵌套预加载语法不兼容低版本、关联方法内部误用with或field导致数据失控,以及全局作用域与软删除未显式处理。通过检查SQL日志、显式声明关键字段、升级版本或改用正确语法、清理关联方法中的查询条件即可解决。

TP6.0 构建支持断点续传的超大附件上传服务【分片】
TP6.0 构建支持断点续传的超大附件上传服务【分片】

在ThinkPHP6.0中实现支持断点续传的超大附件上传,采用分片上传方案。前端按2MB切片并生成唯一chunkId,通过GET请求校验已传分片,用localStorage持久化上传状态。后端控制器接收分片存储,创建upload_status表管理进度,合并时加文件锁并校验MD5,确保生产环境下的可靠性与性能。

thinkphp排序怎么实现动态排序 开发技巧解析
thinkphp排序怎么实现动态排序 开发技巧解析

动态排序时,order()应置于查询链式调用中且必须在paginate()之前;字段和方向需通过白名单硬校验,使用数组语法防SQL注入;分页调用appends()传递参数;多字段排序用关联数组,确保安全稳定。

TP6.0 复杂业务逻辑下事务嵌套的回滚陷阱【DBA】
TP6.0 复杂业务逻辑下事务嵌套的回滚陷阱【DBA】

在复杂业务逻辑中,事务嵌套的回滚问题一直是ThinkPHP开发者容易踩的坑,尤其是TP6.0版本。先说核心结论:TP6.0并不支持真正意义上的嵌套事务。很多人以为调用两次Db::transaction()就能在内部自动管理回滚,实际上这只是一层“伪装”——内层事务的提交或回滚操作会被直接忽略,异常也

thinkphp排序怎么实现倒序排列 教程简单易懂
thinkphp排序怎么实现倒序排列 教程简单易懂

ThinkPHP 实现倒序排列,说穿了就是 order() 方法配合 desc 方向,一句话的事儿,根本不需要什么复杂的循环或额外逻辑。 来看看最直接的方式:用 order('字段名 desc') 搞定。这招的好处是数据库层直接干活,效率高,逻辑也清晰。比如你想让文章列表按照发布时间从新到旧排,那就

TP5.1 项目接入 LDAP 实现后台管理员统一认证【企业】
TP5.1 项目接入 LDAP 实现后台管理员统一认证【企业】

在企业系统逐渐转向统一身份认证的背景下,ThinkPHP 5.1 项目接入 LDAP 实现后台管理员统一认证,是不少团队正在推进的标准化改造。核心思路并不复杂——把框架默认基于数据库的账号校验逻辑彻底换掉,让登录请求直接交给企业 LDAP 目录服务来完成验证。说白了,不是简单改个密码字段,而是要重构

TP5.1 项目启用 HttpOnly 防范 XSS 攻击【安全头】
TP5.1 项目启用 HttpOnly 防范 XSS 攻击【安全头】

在基于TP5.1框架的项目开发中,通过全局配置Cookie的HTTP只读属性、手动设置特定Cookie、修改PHP配置文件强制会话Cookie启用HTTP只读属性,并结合跨站脚本攻击入口过滤,能够有效地防范跨站脚本攻击窃取Cookie,形成多层次纵深防御体系。

thinkphp排序如何按创建时间排序 配置指南
thinkphp排序如何按创建时间排序 配置指南

ThinkPHP中按创建时间排序可通过order()方法实现,支持固定排序、多字段组合及带GET参数的动态排序。分页时需传递query参数保持页码。按天聚合可使用orderRaw()配合DATE_FORMAT函数。对于数组数据,可用array_multisort或usort结合strtotime进行排序。时间格式需统一。

TP8.0 基于 JWT 实现单设备登录挤下线功能【单点登录】
TP8.0 基于 JWT 实现单设备登录挤下线功能【单点登录】

在ThinkPHP8.0中,通过Redis存储用户版本号实现JWT单设备登录强制挤下线机制。每次登录时递增版本号并写入JWT令牌,中间件校验版本一致性,若不一致则返回401状态码。登出或后台踢人时删除Redis键值,从而确保旧会话立即失效。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Postman macOS版
Postman macOS版
Mac

Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

Docker Desktop macOS版
Docker Desktop macOS版
Mac

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

Android Studio macOS版
Android Studio macOS版
Mac

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

WINDOWS 更多
PixPix 网页版
PixPix 网页版
Windows

PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。

Postman Windows版
Postman Windows版
Windows

Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

Docker Desktop Windows版
Docker Desktop Windows版
Windows

Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。