首页 php框架 ThinkPHP 在ThinkPHP6中使用JWT验证

在ThinkPHP6中使用JWT验证

Jun 20, 2023 pm 11:36 PM
thinkphp 编程 jwt验证

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

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

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

开发环境和依赖

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

  • 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 文件,并添加以下代码:

<?php

namespace appcommon;

use FirebaseJWTJWT;

class Token
{
    private static $key = 'your_secret_key';
    private static $alg = 'HS256';

    public static function createToken($data, $expiration = 3600)
    {
        $payload = [
            'iss' => '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:在中间件中验证令牌

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

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

<?php

namespace appmiddleware;

use appcommonToken;
use thinkexceptionHttpResponseException;
use thinkResponse;

class Jwt
{
    public function handle($request, Closure $next)
    {
        if (!$request->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()方法的示例代码。

<?php

namespace appcontroller;

use appcommonToken;

class UserController
{
    public function getUserInfo()
    {
        $data = request()->data;
        ...
    }
    ...
}

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

结论

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

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

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

以上是在ThinkPHP6中使用JWT验证的详细内容。更多信息请关注PHP中文网其他相关文章!

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

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

PHP教程
1545
276
键盘上的音量键无法正常工作 键盘上的音量键无法正常工作 Aug 05, 2025 pm 01:54 PM

First,checkiftheFnkeysettingisinterferingbytryingboththevolumekeyaloneandFn volumekey,thentoggleFnLockwithFn Escifavailable.2.EnterBIOS/UEFIduringbootandenablefunctionkeysordisableHotkeyModetoensurevolumekeysarerecognized.3.Updateorreinstallaudiodriv

Edge PDF查看器不起作用 Edge PDF查看器不起作用 Aug 07, 2025 pm 04:36 PM

testthepdfinanotherapptoderineiftheissueiswiththefileoredge.2.enablethebuilt inpdfviewerbyTurningOff“ eflblyopenpenpenpenpenpdffilesexternally”和“ downloadpdffiles” inedgesettings.3.clearbrowsingdatainclorwearbrowsingdataincludingcookiesandcachedcachedfileresteroresoreloresorelorsolesoresolesoresolvereresoreorsolvereresoreolversorelesoresolvererverenn

python pandas造型数据框架示例 python pandas造型数据框架示例 Aug 04, 2025 pm 01:43 PM

在JupyterNotebook中使用PandasStyling可实现DataFrame的美观展示,1.使用highlight_max和highlight_min高亮每列最大值(绿色)和最小值(红色);2.通过background_gradient为数值列添加渐变背景色(如Blues或Reds)以直观显示数据大小;3.自定义函数color_score结合applymap为不同分数区间设置文字颜色(≥90绿色,80~89橙色,60~79红色,

VS代码快捷方式专注于Explorer面板 VS代码快捷方式专注于Explorer面板 Aug 08, 2025 am 04:00 AM

VSCode中可通过快捷键快速切换面板与编辑区。要跳转至左侧资源管理器面板,使用Ctrl Shift E(Windows/Linux)或Cmd Shift E(Mac);返回编辑区可用Ctrl `或Esc或Ctrl 1~9。相比鼠标操作,键盘快捷键更高效且不打断编码节奏。其他技巧包括:Ctrl KCtrl E聚焦搜索框,F2重命名文件,Delete删除文件,Enter打开文件,方向键展开/收起文件夹。

在打字稿中的高级条件类型 在打字稿中的高级条件类型 Aug 04, 2025 am 06:32 AM

TypeScript的高级条件类型通过TextendsU?X:Y语法实现类型间的逻辑判断,其核心能力体现在分布式条件类型、infer类型推断和复杂类型工具的构建。1.条件类型在裸类型参数上具有分布性,能自动对联合类型拆分处理,如ToArray得到string[]|number[]。2.利用分布性可构建过滤与提取工具:Exclude通过TextendsU?never:T排除类型,Extract通过TextendsU?T:never提取共性,NonNullable过滤null/undefined。3

Python记录到文件示例 Python记录到文件示例 Aug 04, 2025 pm 01:37 PM

Python的logging模块可通过FileHandler将日志写入文件,首先调用basicConfig配置文件处理器和格式,如设置level为INFO、使用FileHandler写入app.log;其次可添加StreamHandler实现同时输出到控制台;进阶场景可用TimedRotatingFileHandler按时间分割日志,例如设置when='midnight'实现每日生成新文件并保留7天备份,需确保日志目录存在;建议使用getLogger(__name__)创建命名logger,生产

修复:Windows Update无法安装 修复:Windows Update无法安装 Aug 08, 2025 pm 04:16 PM

runthewindowsupdatetrubloubleshooterviaSettings>更新&安全> is esseShootsoAtomationfixCommonissues.2.ResetWindowSupDateComponentsByStoppingRealatedServices,RenamingTheSoftWaredWaredWaredSoftwaredSistribution andCatroot2Folders,intrestrestartingthertingthertingtherserviceSteStoceTocle

计算的属性与VUE中的方法 计算的属性与VUE中的方法 Aug 05, 2025 am 05:21 AM

computed有缓存,依赖不变时多次访问不重新计算,而methods每次调用都执行;2.computed适用于基于响应式数据的计算,methods适合需要参数或频繁调用但结果不依赖响应式数据的场景;3.computed支持getter和setter,可实现数据的双向同步,methods不支持;4.总结:优先使用computed以提升性能,当需要传参、执行操作或避免缓存时使用methods,遵循“能用computed就不用methods”的原则。

See all articles