ホームページ >バックエンド開発 >PHPチュートリアル >PHP の OAuth: JWT 認証サーバーを作成する

PHP の OAuth: JWT 認証サーバーを作成する

王林
王林オリジナル
2023-07-28 17:27:201339ブラウズ

PHP での OAuth: JWT 認証サーバーの作成

モバイル アプリケーションの台頭とフロントエンドとバックエンドの分離の傾向により、OAuth は最新の Web アプリケーションに不可欠な部分になりました。 OAuth は、標準化されたプロセスとメカニズムを提供することで、ユーザーのリソースを不正アクセスから保護する承認プロトコルです。この記事では、PHP を使用して JWT (JSON Web Token) に基づいた OAuth 認証サーバーを作成する方法を学びます。

JWT は、Web 上で情報を渡すための安全な方法です。これは、ヘッダー、ペイロード、署名の 3 つの部分で構成されます。通常、ヘッダーにはアルゴリズムやトークン タイプなどのメタデータが含まれています。ペイロードには、ユーザー 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) を定義します。

次に、クライアントの身元を確認するための

verify_client_credentials 関数を実装しました。認可サーバーのエンドポイントでは、まずクライアントから提供された ID 情報を検証し、次に JWT を作成してクライアントに返します。

JWT を取得するエンドポイントでは、まず HTTP リクエスト ヘッダーから JWT を取得し、それを検証してデコードします。 JWT が有効で有効期限が切れていない場合は、ユーザー情報またはその他の保護されたリソースが返されます。

上記のコードはデモンストレーションのみを目的としており、実際の使用では、特定のニーズに応じて拡張および変更する必要があることに注意してください。

概要:

OAuth は、最新の Web アプリケーションで広く使用されている認証プロトコルです。 JWT は情報を安全に転送する方法です。 PHP の Firebase JWT ライブラリを使用すると、JWT ベースの OAuth 認証サーバーを簡単に作成できます。セキュリティと信頼性を確保するために、特定のニーズに応じて変更および拡張してください。

上記は、PHP を使用して JWT 認可サーバーを作成するための概要とサンプルコードです。この記事が、OAuth と JWT の関連知識の理解と使用に役立つことを願っています。

以上がPHP の OAuth: JWT 認証サーバーを作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。