인터넷의 발달과 함께 웹 애플리케이션 사용자가 점차 늘어나면서 보안 문제가 더욱 중요해지고 있습니다. 인증된 사용자만 권한이 필요한 리소스에 액세스할 수 있으므로 인증은 웹 애플리케이션 보안의 중요한 부분입니다.
JSON 웹 토큰(JWT)은 웹 애플리케이션 간에 정보를 안전하게 전송하는 좋은 방법인 경량의 독립형 인증 토큰입니다. JWT 인증 체계는 분산 시스템 및 단일 페이지 애플리케이션에 적합합니다.
ThinkPHP는 보안 웹 애플리케이션을 개발하기 위한 다양한 도구를 제공하는 인기 있는 PHP 프레임워크입니다. 이 기사에서는 ThinkPHP6에서 인증을 위해 JWT를 사용하여 애플리케이션의 보안을 강화하는 방법을 다룹니다.
개발 환경 및 종속성
시작하기 전에 개발 환경이 올바르게 설정되었는지 확인해야 합니다. 다음은 이 문서에서 사용된 환경 및 종속성입니다. 귀하의 필요에 따라 적절하게 변경하십시오.
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
rrreee
이 미들웨어에서는 Token 클래스의verifyToken()
메서드를 사용하여 JWT를 확인합니다. 이 메서드는 토큰이 유효한지 여부를 나타내는 true 또는 false를 반환합니다. 유효한 경우 getDataByToken()
메서드를 사용하여 JWT의 데이터 부분을 가져와 $request->data
에 저장합니다. 그런 다음 이 데이터를 컨트롤러에서 사용할 수 있습니다. 4단계: 경로 설정🎜🎜미들웨어를 생성했으므로 이제 이를 적절한 경로에 적용해야 합니다. 🎜🎜/api/user
경로를 보호하고 싶다면 route pi.php
파일에서 다음과 같이 경로를 설정해야 합니다. 🎜rrreee🎜참고하세요 이 경로에서는 Jwt
미들웨어를 매개변수로 middleware()
메서드에 전달합니다. 이는 UserController
의 getUserInfo()
메서드에 대한 샘플 코드입니다. 🎜rrreee🎜컨트롤러에서는 $request->data
를 호출하여 인증된 JWT에 저장된 데이터에 액세스할 수 있습니다. 🎜🎜결론🎜🎜JWT 인증 방법을 사용하면 웹 애플리케이션을 더욱 안전하고 안정적으로 만들 수 있습니다. 이 기사에서는 Firebase JWT PHP 라이브러리를 사용하여 ThinkPHP6에서 JWT를 생성하고 검증하는 방법을 다루었습니다. 🎜🎜JWT 관련 작업을 처리하는 데 사용되는 Token이라는 클래스를 만들고 JWT 검증 및 데이터 설정을 위한 미들웨어를 추가했습니다. 마지막으로 이 미들웨어를 사용하여 JWT에 저장된 데이터에 액세스하는 라우팅 및 컨트롤러 코드를 설정합니다. 🎜🎜JWT 인증을 도입하는 주요 목적은 애플리케이션의 리소스를 인증된 사용자만 사용할 수 있도록 하는 것입니다. 이 기사가 JWT 인증을 사용하여 애플리케이션을 보호하는 방법을 이해하는 데 도움이 되었기를 바랍니다. 🎜위 내용은 ThinkPHP6에서 JWT 검증 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!