>  기사  >  PHP 프레임워크  >  ThinkPHP6에서 JWT 검증 사용

ThinkPHP6에서 JWT 검증 사용

PHPz
PHPz원래의
2023-06-20 23:36:093160검색

인터넷의 발달과 함께 웹 애플리케이션 사용자가 점차 늘어나면서 보안 문제가 더욱 중요해지고 있습니다. 인증된 사용자만 권한이 필요한 리소스에 액세스할 수 있으므로 인증은 웹 애플리케이션 보안의 중요한 부분입니다.

JSON 웹 토큰(JWT)은 웹 애플리케이션 간에 정보를 안전하게 전송하는 좋은 방법인 경량의 독립형 인증 토큰입니다. JWT 인증 체계는 분산 시스템 및 단일 페이지 애플리케이션에 적합합니다.

ThinkPHP는 보안 웹 애플리케이션을 개발하기 위한 다양한 도구를 제공하는 인기 있는 PHP 프레임워크입니다. 이 기사에서는 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단계: 토큰 클래스 만들기

JWT의 관리 및 사용을 용이하게 하기 위해 JWT 확인의 다양한 측면을 처리하는 Token이라는 클래스를 만듭니다. 이 클래스에는 토큰 생성, 토큰 확인, 토큰 정보 획득과 ​​같은 기능이 포함됩니다.

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 페이로드의 4개 키(iss, iat, exp 및 sub)를 사용하고 사용자 정의 데이터를 추가합니다. $expiration 매개변수는 JWT의 만료 시간을 지정합니다. 따라서 JWT는 유효기간 내에만 사용할 수 있습니다. 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

3단계: 미들웨어에서 토큰 확인

JWT 관련 작업을 처리하기 위해 Token 클래스를 생성했으므로 이제 미들웨어에서 사용자 JWT를 확인해야 합니다. 미들웨어를 사용하면 애플리케이션의 컨트롤러 코드에서 쉽게 응답을 가로채고 설정할 수 있으며 더 나은 관리 및 수정을 위해 코드를 여러 클래스로 분리할 수 있습니다.

app/middleware 디렉터리에 Jwt.php 파일을 생성하고 다음 코드를 추가합니다.

rrreee

이 미들웨어에서는 Token 클래스의 verifyToken() 메서드를 사용하여 JWT를 확인합니다. 이 메서드는 토큰이 유효한지 여부를 나타내는 true 또는 false를 반환합니다. 유효한 경우 getDataByToken() 메서드를 사용하여 JWT의 데이터 부분을 가져와 $request->data에 저장합니다. 그런 다음 이 데이터를 컨트롤러에서 사용할 수 있습니다.

4단계: 경로 설정🎜🎜미들웨어를 생성했으므로 이제 이를 적절한 경로에 적용해야 합니다. 🎜🎜/api/user 경로를 보호하고 싶다면 route pi.php 파일에서 다음과 같이 경로를 설정해야 합니다. 🎜rrreee🎜참고하세요 이 경로에서는 Jwt 미들웨어를 매개변수로 middleware() 메서드에 전달합니다. 이는 UserControllergetUserInfo() 메서드에 대한 샘플 코드입니다. 🎜rrreee🎜컨트롤러에서는 $request->data를 호출하여 인증된 JWT에 저장된 데이터에 액세스할 수 있습니다. 🎜🎜결론🎜🎜JWT 인증 방법을 사용하면 웹 애플리케이션을 더욱 안전하고 안정적으로 만들 수 있습니다. 이 기사에서는 Firebase JWT PHP 라이브러리를 사용하여 ThinkPHP6에서 JWT를 생성하고 검증하는 방법을 다루었습니다. 🎜🎜JWT 관련 작업을 처리하는 데 사용되는 Token이라는 클래스를 만들고 JWT 검증 및 데이터 설정을 위한 미들웨어를 추가했습니다. 마지막으로 이 미들웨어를 사용하여 JWT에 저장된 데이터에 액세스하는 라우팅 및 컨트롤러 코드를 설정합니다. 🎜🎜JWT 인증을 도입하는 주요 목적은 애플리케이션의 리소스를 인증된 사용자만 사용할 수 있도록 하는 것입니다. 이 기사가 JWT 인증을 사용하여 애플리케이션을 보호하는 방법을 이해하는 데 도움이 되었기를 바랍니다. 🎜

위 내용은 ThinkPHP6에서 JWT 검증 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.