>백엔드 개발 >PHP 튜토리얼 >PHP의 OAuth: JWT 인증 서버 만들기

PHP의 OAuth: JWT 인증 서버 만들기

王林
王林원래의
2023-07-28 17:27:201337검색

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가 유효하고 만료되지 않은 경우 사용자 정보 또는 기타 보호되는 리소스를 반환합니다.

위 코드는 데모용일 뿐이라는 점에 유의하세요. 실제 사용에서는 특정 요구에 따라 확장하고 수정해야 합니다.


요약:

OAuth는 최신 웹 애플리케이션에서 널리 사용되는 인증 프로토콜입니다. JWT는 정보를 안전하게 전송하는 방법입니다. PHP의 Firebase JWT 라이브러리를 사용하면 JWT 기반 OAuth 인증 서버를 쉽게 만들 수 있습니다. 보안과 신뢰성을 보장하려면 특정 요구 사항에 따라 수정하고 확장하십시오.

위는 PHP를 사용하여 JWT 인증 서버를 생성하기 위한 소개 및 샘플 코드입니다. 이 글이 여러분이 OAuth와 JWT 관련 지식을 이해하고 활용하는 데 도움이 되기를 바랍니다. 🎜

위 내용은 PHP의 OAuth: JWT 인증 서버 만들기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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