ホームページ >バックエンド開発 >PHPチュートリアル >PHP 開発: 認証と認可に JWT を使用する方法
現代の 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()
メソッドは、header
、payload
、および 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 サイトの他の関連記事を参照してください。