ホームページ  >  記事  >  バックエンド開発  >  PHP 開発: 認証と認可に JWT を使用する方法

PHP 開発: 認証と認可に JWT を使用する方法

王林
王林オリジナル
2023-06-14 16:14:511815ブラウズ

現代の Web アプリケーション開発では、セキュリティが不可欠な部分になっています。認証と認可は、許可されたユーザーのみが保護されたリソースにアクセスできるようにするため、この点で非常に重要です。利用可能な認証および認可メカニズムは数多くありますが、その中でも JWT (JSON Web Token) は、シンプルで柔軟、スケーラブルで安全であるため、特に人気のあるメカニズムです。この記事では、認証と認可に PHP と JWT を使用する方法を説明します。

パート 1: JWT の基本

JSON Web Token (JWT) は、Web 上でクレームと認証情報を安全に送信するためのオープン スタンダードです。これは、ヘッダー、ペイロード、署名の 3 つの部分で構成されます。

ヘッダーには、アルゴリズムとトークン タイプの情報が含まれています。その例は次のようになります。

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

ペイロードには、送信する必要がある情報が含まれています。たとえば、ユーザー名、役割、ユーザーに関するその他の情報などです。ペイロードの例は次のようになります。

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

署名は、JWT が有効であることを検証するために使用されるキーを含む暗号化された文字列です。署名の例は次のようになります。

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

パート 2: PHP を使用した JWT の実装

認証と認可に JWT を使用するには、 JWT。単純な 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));
  }
}

この PHP クラスでは、$header$payload、および $secret に JWT ヘッダー、ペイロード、およびシークレット情報が保存されます。 encode() メソッドは、headerpayload、および secret を使用して JWT 文字列を生成します。 decode() メソッドは、指定された JWT 文字列とキーを使用してペイロード情報を取得します。

base64UrlEncode() メソッドと base64UrlDecode() メソッドは、JWT ヘッダーとペイロードのエンコードとデコードに使用されます。

パート 3: 認証と認可に JWT を使用する

これで、JWT の基本を理解でき、JWT を生成および検証するための PHP JWT クラスができました。では、認証と認可に JWT を使用するにはどうすればよいでしょうか?

まず、ユーザーがログインすると、ID を認証するために JWT を使用してトークンを送信できます。サーバーはユーザー名とパスワードのペイロードを含む JWT を生成し、クライアントに送信します。クライアントは、すべてのリクエストでベアラー認証スキームの Authorization ヘッダーとしてこのトークンを送信します。サーバーはヘッダーから 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'] で定義されます。これは長い文字列である必要があります。このパスワードは秘密のパスワードであるため、コード ベースに含めないでください。通常、このキーは環境変数に保存され、Web サーバーを実行しているオペレーティング システムによって管理されます。

結論

JWT は、Web アプリケーションでの認証と認可に使用できる、非常にシンプルで柔軟、スケーラブルで安全なメカニズムです。この記事では、JWT の基本を説明し、JWT を生成および検証するためのサンプル PHP クラスを見てきました。また、JWT を認証と認可にどのように使用できるかについても説明しました。 Web アプリケーションで JWT を試して、アプリケーションの安全性を確保できるようになりました。

以上がPHP 開発: 認証と認可に JWT を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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