Maison  >  Article  >  développement back-end  >  Développement PHP : Comment utiliser JWT pour l'authentification et l'autorisation

Développement PHP : Comment utiliser JWT pour l'authentification et l'autorisation

王林
王林original
2023-06-14 16:14:511865parcourir

Dans le développement d'applications Web modernes, la sécurité est devenue une partie intégrante. L'authentification et l'autorisation sont cruciales à cet égard, car elles garantissent que seuls les utilisateurs autorisés peuvent accéder aux ressources protégées. Il existe de nombreux mécanismes d’authentification et d’autorisation, parmi lesquels JWT (JSON Web Token) est un mécanisme particulièrement apprécié car simple, flexible, évolutif et sécurisé. Dans cet article, nous explorerons comment utiliser PHP et JWT pour l'authentification et l'autorisation.

Première partie : principes de base de JWT

JSON Web Token (JWT) est un standard ouvert permettant de transmettre en toute sécurité des réclamations et des informations d'authentification sur le Web. Il se compose de trois parties : en-tête, charge utile et signature.

L'en-tête contient des informations sur l'algorithme et le type de jeton. Un exemple pourrait ressembler à ceci :

{
  "alg": "HS256",
  "typ": "JWT"
}

La charge utile contient les informations qui doivent être transmises. Par exemple, le nom d'utilisateur, le rôle et d'autres informations sur l'utilisateur. Un exemple de charge utile pourrait ressembler à ceci :

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

Une signature est une chaîne cryptée contenant la clé utilisée pour vérifier que le JWT est valide. Un exemple de signature pourrait ressembler à ceci :

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(claims),
  secret)

Partie 2 : Implémentation de JWT à l'aide de PHP

Afin d'utiliser JWT pour l'authentification et l'autorisation, nous avons besoin d'une classe PHP pour générer et vérifier le JWT. Regardons l'implémentation d'une simple classe PHP JWT.

<?php

class JWT {
  private $header;
  private $payload;
  private $secret;

  public function __construct($header, $payload, $secret) {
    $this->header = $header;
    $this->payload = $payload;
    $this->secret = $secret;
  }

  public function encode() {
    $header = $this->base64UrlEncode(json_encode($this->header));
    $payload = $this->base64UrlEncode(json_encode($this->payload));
    $signature = $this->base64UrlEncode(hash_hmac('sha256', $header . '.' . $payload, $this->secret, true));
    return $header . '.' . $payload . '.' . $signature;
  }

  public function decode($jwt) {
    $parts = explode('.', $jwt);
    $header = json_decode($this->base64UrlDecode($parts[0]), true);
    $payload = json_decode($this->base64UrlDecode($parts[1]), true);
    $signature = $this->base64UrlDecode($parts[2]);
    $result = hash_hmac('sha256', $parts[0] . '.' . $parts[1], $this->secret, true);
    if (hash_equals($result, $signature)) {
      return $payload;
    } else {
      return null;
    }
  }

  private function base64UrlEncode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
  }

  private function base64UrlDecode($data) {
    return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
  }
}

Dans cette classe PHP, $header, $payload et $secret stockent l'en-tête JWT, la charge utile et les informations clés. La méthode encode() utilise header, payload et secret pour générer une chaîne JWT. La méthode decode() utilise la chaîne et la clé JWT données pour obtenir des informations sur la charge utile. $header$payload$secret 存储了 JWT 的头部、载荷和密钥信息。encode() 方法使用 headerpayloadsecret 来生成 JWT 字符串。decode() 方法使用给定的 JWT 字符串和密钥来获取载荷信息。

base64UrlEncode()base64UrlDecode() 方法用于编码和解码 JWT 的头部和载荷。

第三部分:将 JWT 用于身份认证和授权

现在,我们已经了解了 JWT 的基础知识,并且有一个 PHP JWT 类用于生成和验证 JWT。那么,我们如何将 JWT 用于身份认证和授权呢?

首先,当用户登录时,可以使用 JWT 发送一个令牌来验证他们的身份。服务器将生成一个带有用户名和密码有效载荷的 JWT,并将其发送给客户端。客户端将在每个请求中将此令牌作为 Authorization 标头的 Bearer 认证方案进行发送。服务器将从标头中提取 JWT 并根据需要验证其有效性。

以下是一个示例 JWT 实现用于身份认证和授权:

<?php

// 使用 JWT 登录
function login($username, $password) {
  // 检查用户名和密码是否正确
  $is_valid = validate_user_credentials($username, $password);
  if (!$is_valid) {
    return null;
  }

  // 生成 JWT
  $header = array('alg' => 'HS256', 'typ' => 'JWT');
  $payload = array('sub' => $username);
  $jwt = new JWT($header, $payload, $GLOBALS['secret']);
  $token = $jwt->encode();

  // 返回 JWT
  return $token;
}

// 验证 JWT
function validate_token($jwt) {
  $jwt = new JWT($header, $payload, $GLOBALS['secret']);
  $payload = $jwt->decode($jwt);
  if ($payload == null) {
    return false;
  }

  // 验证成功
  return true;
}

// 保护资源
function protect_resource() {
  // 检查 JWT 是否有效
  $jwt = get_authorization_header();
  if (!validate_token($jwt)) {
    http_response_code(401);
    exit();
  }

  // 资源保护
  // ...
}

// 从标头获取 JWT
function get_authorization_header() {
  $headers = getallheaders();
  if (isset($headers['Authorization'])) {
    return $headers['Authorization'];
  }
  return null;
}

// 检查用户名和密码是否正确
function validate_user_credentials($username, $password) {
  // 验证用户名和密码
  // ...
  return true;
}

// 密钥
$GLOBALS['secret'] = "my-secret";

// 登录并获取 JWT
$token = login("username", "password");

// 将 JWT 添加到标头
$headers = array('Authorization: Bearer ' . $token);

// 保护资源
protect_resource($headers);

在这个示例中,login() 方法使用 JWT 类创建一个 JWT,并返回它以便客户端使用。validate_token() 方法可以验证 JWT 的有效性。如果 JWT 无效,将返回 false。

get_authorization_header() 方法从请求标头中提取 JWT。 protect_resource() 方法用于保护 Web 资源。如果 JWT 无效,该函数将引发 401 错误。

最后,在全局范围内定义了一个密钥,$GLOBALS ['secret']

Les méthodes base64UrlEncode() et base64UrlDecode() sont utilisées pour encoder et décoder l'en-tête et la charge utile JWT.

Partie 3 : Utiliser JWT pour l'authentification et l'autorisation

Maintenant, nous avons compris les bases de JWT et disposons d'une classe PHP JWT pour générer et valider JWT. Alors, comment utiliser JWT pour l'authentification et l'autorisation ? 🎜🎜Tout d'abord, lorsqu'un utilisateur se connecte, vous pouvez utiliser JWT pour envoyer un jeton afin de vérifier son identité. Le serveur générera un JWT avec la charge utile du nom d'utilisateur et du mot de passe et l'enverra au client. Le client enverra ce jeton comme en-tête d'autorisation du schéma d'authentification du porteur à chaque demande. Le serveur extraira le JWT de l'en-tête et vérifiera sa validité si nécessaire. 🎜🎜Voici un exemple d'implémentation JWT pour l'authentification et l'autorisation : 🎜rrreee🎜Dans cet exemple, la méthode login() crée un JWT à l'aide de la classe JWT et renvoie C'est à l'usage des clients. La méthode validate_token() peut vérifier la validité du JWT. Si le JWT n'est pas valide, false sera renvoyé. La méthode 🎜🎜get_authorization_header() extrait le JWT de l'en-tête de la requête. La méthode protect_resource() est utilisée pour protéger les ressources Web. Si le JWT n'est pas valide, cette fonction générera une erreur 401. 🎜🎜Enfin, un secret est défini dans la portée globale, $GLOBALS ['secret'] , qui doit être une longue chaîne. Veuillez noter que ce mot de passe est un mot de passe secret et ne doit pas être inclus dans votre base de code. Généralement, cette clé est stockée dans une variable d'environnement et gérée par le système d'exploitation exécutant le serveur Web. 🎜🎜Conclusion🎜🎜JWT est un mécanisme très simple, flexible, évolutif et sécurisé d'authentification et d'autorisation dans les applications Web. Dans cet article, nous avons examiné les bases de JWT et vu un exemple de classe PHP pour générer et valider JWT. Nous avons également vu comment JWT peut être utilisé pour l'authentification et l'autorisation. Vous pouvez désormais essayer JWT dans vos applications Web pour vous assurer que vos applications sont plus sécurisées. 🎜

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!

Déclaration:
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