0

0

在ThinkPHP6中使用JWT验证

PHPz

PHPz

发布时间:2023-06-20 23:36:09

|

4446人浏览过

|

来源于php中文网

原创

随着互联网的发展,web应用的用户量逐渐增多,安全问题也成为了越来越重要的问题。身份验证是web应用安全的重要组成部分,因为只有经过身份验证的用户才能访问需要权限的资源。

JSON Web Token (JWT) 是一种轻便、自包含的认证 token,是在 Web 应用间安全地传输信息的好方法。JWT 认证方案适用于分布式系统和单页应用。

ThinkPHP是一个流行的PHP框架,它提供了许多工具来开发安全的Web应用程序。在本文中,我们将介绍如何在ThinkPHP6中使用JWT进行身份验证以增强应用程序的安全性。

开发环境和依赖

在开始之前,我们需要确保开发环境已经正确设置。以下是本文所使用的环境和依赖。请根据您的需求进行相应地更改。

立即学习PHP免费学习笔记(深入)”;

  • PHP 7.2 或更高版本
  • ThinkPHP 6.0.0 或更高版本
  • Firebase JWT PHP 库

步骤1:安装 Firebase JWT PHP 库

安装 Firebase JWT PHP 库是使用 JWT 身份验证方案的第一步。该库将帮助我们创建、签名和验证 JWT。

我们可以使用 Composer 安装 Firebase JWT PHP 库。 在命令行中输入以下命令:

composer require firebase/php-jwt

步骤2:创建Token类

为了便于管理和使用 JWT,我们创建一个名为Token的类来处理 JWT 验证的各个方面。这个类将包括创建令牌,验证令牌,获取令牌信息等功能。

在 app/common 目录下创建 Token.php 文件,并添加以下代码:

 'localhost',
            'sub' => 'token',
            'iat' => time(),
            'exp' => time() + $expiration,
            'data' => $data
        ];

        return JWT::encode($payload, self::$key, self::$alg);
    }

    public static function decodeToken($token)
    {
        return JWT::decode($token, self::$key, [self::$alg]);
    }

    public static function getDataByToken($token)
    {
        $decoded = self::decodeToken($token);

        if (isset($decoded->data)) {
            return $decoded->data;
        } else {
            return false;
        }
    }

    public static function verifyToken($token)
    {
        $result = false;
        try {
            $decoded = self::decodeToken($token);
            $result = true;
        } catch (Exception $e) {
            // Invalid token
        }
        return $result;
    }
}

在代码中,我们使用FirebaseJWTJWT库中的encode()decode()方法来创建和解析 JWT。$key是我们用于签名 JWT 的密钥,$alg是我们选择的算法。 在createToken()方法中,我们使用 JWT 负载中的四个键(iss,iat,exp和sub)并添加自定义data$expiration参数指定 JWT 的过期时间。因此,JWT 只能在有效期内使用。

步骤3:在中间件中验证令牌

mallcloud商城
mallcloud商城

mallcloud商城基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离vue的企业级微服务敏捷开发系统架构。并引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手容易,适合学习和企业中使用。真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案,面向互联网设计同时适合B端和C端用户,支持CI/CD多环境部署,并提

下载

现在我们已经创建了 Token 类以处理 JWT 相关的工作,我们需要在中间件中验证用户 JWT。使用中间件可以方便地在应用程序的控制器代码中拦截和设置响应,并且可以将代码分离到不同的类中以便更好地管理和修改。

在 app/middleware 目录下创建Jwt.php文件,并添加以下代码:

header('Authorization')) {
            return json(['code' => 401, 'msg' => 'Unauthorized']);
        }

        $header = $request->header('Authorization');
        $token = substr($header, 7);
        if (Token::verifyToken($token)) {
            $request->data = Token::getDataByToken($token);
            return $next($request);
        } else {
            return json(['code' => 401, 'msg' => 'Unauthorized']);
        }
    }
}

在此中间件中,我们使用 Token 类中的verifyToken()方法来验证 JWT。 此方法将返回 true 或 false,表示令牌是否有效。 如果有效,我们将使用getDataByToken()方法来获取 JWT 的数据部分并将其存储在$request->data中。 这样,控制器就可以使用此数据。

步骤4:设置路由

现在,我们已经创建了中间件,我们需要将其应用到适当的路由上。

假设我们要保护/api/user的路由,我们需要在routepi.php文件中按如下方式设置路由:

use appmiddlewareJwt;

Route::group('api', function() {
  Route::get('user', 'UserController@getUserInfo')->middleware(Jwt::class);
});

请注意,在此路由中,我们将Jwt中间件作为参数传递给middleware()方法。这是UserController中的getUserInfo()方法的示例代码。

data;
        ...
    }
    ...
}

在控制器中,您可以通过调用$request->data来访问经过身份验证的 JWT 中存储的数据。

结论

JWT 身份验证方法可以使您的 Web 应用程序更安全和可靠。在本文中,我们介绍了如何在ThinkPHP6中使用 Firebase JWT PHP 库来创建和验证 JWT。

我们创建了一个名为 Token 的类,该类用于处理 JWT 相关的工作,并且添加了一个用于验证 JWT 并设置数据的中间件。最后,我们设置了使用此中间件的路由和控制器代码以访问存储在 JWT 中的数据。

引入 JWT 身份验证的主要目的是确保应用程序中的资源只能被经过身份验证的用户使用。希望本文能够帮助您了解如何使用 JWT 身份验证来保护您的应用程序!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2541

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1608

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1500

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1416

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1446

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.8万人学习

Node.js 教程
Node.js 教程

共57课时 | 8.6万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号