OAuth en PHP : créer un serveur d'autorisation JWT

王林
Libérer: 2023-07-28 18:32:01
original
1295 Les gens l'ont consulté

OAuth en PHP : création d'un serveur d'autorisation JWT

Avec l'essor des applications mobiles et la tendance à la séparation front-end et back-end, OAuth est devenu un élément indispensable des applications Web modernes. OAuth est un protocole d'autorisation qui protège les ressources des utilisateurs contre tout accès non autorisé en fournissant des processus et des mécanismes standardisés. Dans cet article, nous allons apprendre comment créer un serveur d'autorisation OAuth basé sur JWT (JSON Web Tokens) à l'aide de PHP.

JWT est un moyen sécurisé de transmettre des informations sur le Web. Il se compose de trois parties, à savoir l'en-tête, la charge utile et la signature. L'en-tête contient généralement des métadonnées, telles que l'algorithme et le type de jeton. La charge utile contient des informations spécifiques à transmettre, telles que l'ID utilisateur, les autorisations et le délai d'expiration. La signature est le résultat du cryptage de l'en-tête et de la charge utile à l'aide d'une clé privée pour garantir l'intégrité et la sécurité du jeton.

Tout d'abord, nous devons créer un projet PHP et installer une bibliothèque JWT. Dans cet exemple, nous utiliserons la bibliothèque "firebase/php-jwt". Il peut être installé via Composer, exécutez la commande suivante :

composer require firebase/php-jwt
Copier après la connexion

Dans le répertoire racine du projet, nous créons un fichier "oauth.php" pour nous servir de serveur d'autorisation.

Voici un exemple simple de code de serveur d'autorisation :

<?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;
    }
}
?>
Copier après la connexion

Dans l'exemple ci-dessus, nous définissons d'abord la clé du serveur ($server_key) et l'heure d'expiration ($expiry_time code>) . Ensuite, nous définissons des ID client et des secrets valides (<code>$valid_clients). $server_key)和过期时间($expiry_time)。然后,我们定义了有效的客户端ID和秘密($valid_clients)。

接下来,我们实现了一个verify_client_credentials

Ensuite, nous implémentons une fonction verify_client_credentials pour vérifier l'identité du client. Dans le point de terminaison du serveur d'autorisation, nous vérifions d'abord les informations d'identité fournies par le client, puis créons un JWT et le renvoyons au client.

Dans le point de terminaison pour obtenir le JWT, nous obtenons d'abord le JWT à partir de l'en-tête de la requête HTTP, puis nous le validons et le décodons. Si le JWT est valide et n'a pas expiré, nous renverrons les informations utilisateur ou d'autres ressources protégées.

Il est à noter que le code ci-dessus est uniquement à des fins de démonstration. En utilisation réelle, nous devons l'étendre et le modifier en fonction des besoins spécifiques.


Résumé :

OAuth est un protocole d'autorisation largement utilisé dans les applications Web modernes. JWT est une méthode sécurisée de transfert d'informations. Avec la bibliothèque Firebase JWT en PHP, nous pouvons facilement créer un serveur d'autorisation OAuth basé sur JWT. Veuillez modifier et développer en fonction des besoins spécifiques pour garantir la sécurité et la fiabilité.

Ce qui précède est l'introduction et un exemple de code pour créer un serveur d'autorisation JWT à l'aide de PHP. J'espère que cet article pourra vous aider à comprendre et à utiliser les connaissances pertinentes d'OAuth et de JWT. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal