PHP의 OAuth: JWT 인증 서버 만들기
모바일 애플리케이션의 증가와 프런트엔드와 백엔드 분리 추세로 인해 OAuth는 현대 웹 애플리케이션에서 없어서는 안 될 부분이 되었습니다. OAuth는 표준화된 프로세스와 메커니즘을 제공하여 사용자의 리소스를 무단 액세스로부터 보호하는 인증 프로토콜입니다. 이번 글에서는 PHP를 사용하여 JWT(JSON 웹 토큰) 기반 OAuth 인증 서버를 생성하는 방법을 알아봅니다.
JWT는 웹 전체에서 정보를 전달하는 안전한 방법입니다. 헤더, 페이로드, 서명의 세 부분으로 구성됩니다. 헤더에는 일반적으로 알고리즘 및 토큰 유형과 같은 일부 메타데이터가 포함됩니다. 페이로드에는 사용자 ID, 권한, 만료 시간 등 전달될 특정 정보가 포함되어 있습니다. 서명은 토큰의 무결성과 보안을 보장하기 위해 개인 키를 사용하여 헤더와 페이로드를 암호화한 결과입니다.
먼저 PHP 프로젝트를 생성하고 JWT 라이브러리를 설치해야 합니다. 이 예에서는 "firebase/php-jwt" 라이브러리를 사용합니다. Composer를 통해 설치할 수 있으며 다음 명령을 실행합니다:
composer require firebase/php-jwt
프로젝트 루트 디렉터리에서 인증 서버 역할을 할 "oauth.php" 파일을 생성합니다.
다음은 간단한 인증 서버 코드 예입니다.
<?php require 'vendor/autoload.php'; use FirebaseJWTJWT; // 定义服务器密钥 $server_key = 'your-secret-key'; // 定义过期时间,单位为秒 $expiry_time = 3600; // 定义有效的客户端ID和秘密 $valid_clients = [ 'client_id1' => 'client_secret1', 'client_id2' => 'client_secret2', ]; // 验证客户端ID和秘密 function verify_client_credentials($client_id, $client_secret) { global $valid_clients; return isset($valid_clients[$client_id]) && $valid_clients[$client_id] === $client_secret; } // 授权服务器端点 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 验证客户端身份 $client_id = $_POST['client_id']; $client_secret = $_POST['client_secret']; if (!verify_client_credentials($client_id, $client_secret)) { http_response_code(401); echo json_encode(['error' => 'Invalid client credentials']); exit; } // 创建JWT $token = [ 'iss' => $_SERVER['SERVER_NAME'], 'aud' => $client_id, 'iat' => time(), 'exp' => time() + $expiry_time ]; $jwt = JWT::encode($token, $server_key); // 返回JWT给客户端 echo json_encode(['access_token' => $jwt]); exit; } // 获取JWT if ($_SERVER['REQUEST_METHOD'] === 'GET') { $auth_header = $_SERVER['HTTP_AUTHORIZATION']; $jwt = substr($auth_header, 7); // 去掉"Bearer "前缀 try { // 验证和解码JWT $decoded = JWT::decode($jwt, $server_key, ['HS256']); // 验证有效性 if ($decoded->exp < time()) { http_response_code(401); echo json_encode(['error' => 'Token expired']); exit; } // 返回用户信息或其他受保护的资源 echo json_encode(['user_id' => $decoded->sub]); exit; } catch (Exception $e) { // 如果JWT无效,返回错误 http_response_code(401); echo json_encode(['error' => $e->getMessage()]); exit; } } ?>
위 예에서는 먼저 서버 키($server_key
)와 만료 시간($expiry_time
)을 정의합니다. . 그런 다음 유효한 클라이언트 ID와 비밀($valid_clients
)을 정의합니다. $server_key
)和过期时间($expiry_time
)。然后,我们定义了有效的客户端ID和秘密($valid_clients
)。
接下来,我们实现了一个verify_client_credentials
verify_client_credentials
함수를 구현합니다. 인증 서버 엔드포인트에서는 먼저 클라이언트가 제공한 ID 정보를 확인한 다음 JWT를 생성하여 클라이언트에 반환합니다. JWT를 가져오기 위한 엔드포인트에서는 먼저 HTTP 요청 헤더에서 JWT를 가져온 다음 이를 검증하고 디코딩합니다. JWT가 유효하고 만료되지 않은 경우 사용자 정보 또는 기타 보호되는 리소스를 반환합니다. 위 코드는 데모용일 뿐이라는 점에 유의하세요. 실제 사용에서는 특정 요구에 따라 확장하고 수정해야 합니다.
요약:
위 내용은 PHP의 OAuth: JWT 인증 서버 만들기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!