アプリケーション認証は、ユーザー名/メールボックスやパスワードなどの資格情報のみに依存するために使用され、セッションはユーザーがログアウトするまでユーザーのステータスを維持するために使用されました。その後、認証APIの使用を開始しました。最近、JSON Web Tokens(JWT)がサーバーリクエストの認証にますます使用されています。
この記事では、JWTとは何か、JWTベースのユーザーリクエスト認証にPHPを使用する方法を紹介します。
キーポイント
まず第一に、なぜ会話がそれほど良くないのですか?主な理由は3つあります データは、単純なテキストでサーバーに保存されます。データが通常パブリックフォルダーに保存されていなくても、十分なサーバーアクセスを持つ人なら誰でもセッションファイルのコンテンツを読み取ることができます。
ファイルシステムの読み取り/書き込みリクエストが含まれます。セッションが開始されるか、そのデータが変更されるたびに、サーバーはセッションファイルを更新する必要があります。アプリがセッションクッキーを送信するたびに同じことが言えます。ユーザーの数が多い場合、MemcachedやRedisなどの代替セッションストレージオプションを使用しない限り、サーバーが遅くなる可能性があります。
JWTには、以下を含むAPIキーよりも多くの利点があります jwtはどのように見えますか? これはJWTの例です
<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
最初の文字列はJWTヘッダーです。 Base64 URLエンコードJSON文字列です。これは、常にJWTに設定されている署名とトークンのタイプを生成するために使用される暗号化アルゴリズムを指定します。アルゴリズムは、
非対称アルゴリズムは、秘密鍵を使用してトークンに署名し、公開キーを使用してトークンを確認します。これらのアルゴリズムは、共有キーが非現実的である場合、または他の当事者がトークンの完全性を検証するだけである場合に使用する必要があります。 JWTのペイロード
2番目の文字列はJWTのペイロードです。また、Base64 URLエンコードJSON文字列でもあります。 「宣言」と呼ばれるいくつかの標準フィールドが含まれています。宣言には3種類のタイプがあります:
登録、private。 登録明細書は事前に定義されています。 JWTのRFCでそれらのリストを見つけることができます。一般的に使用されるステートメントをいくつか紹介します:
IAT:トークンによって発行された日付とタイムスタンプ。キー:トークンの検証に使用できる一意の文字列ですが、これは集中化されていない発行者機関に反します。
JWTの署名は、トークンのコンテンツに固有のデジタル署名を使用してJWTのデータを保護するように設計された暗号化メカニズムです。署名により、JWTの完全性が保証され、ユーザーが悪意のある俳優によって改ざんされていないことを確認できます。
これら3つは、JWTヘッダー(非暗号化されていない)で指定されたアルゴリズムを使用してデジタル署名されています。上記の例をデコードすると、次のJSON文字列が取得されます。
jwtのヘッダー
<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
<code>{ "alg": "HS256", "typ": "JWT" }</code>
PHPベースのアプリケーションでJWTを使用してください
JWTが何であるかを学んだので、PHPアプリケーションでそれらを使用する方法を学ぶ時が来ました。この記事を掘り下げる前に、この記事のコードを自由にクローンするか、手順に従ってください。JWTを統合するために多くの方法をとることができますが、ここに私たちが取るものがあります。
ログインページとログアウトページとは別に、アプリケーションへのすべての要求をJWTを介して認証する必要があります。ユーザーがJWTなしでリクエストを行うと、ログインページにリダイレクトされます。
ユーザーがログインフォームに記入して提出した後、フォームはjavaScriptを介してアプリケーションのログインエンドポイントAuthenticate.phpに送信されます。エンドポイントは、リクエストから資格情報(ユーザー名とパスワード)を引き出し、有効であることをチェックします。
有効な場合、JWTを生成してクライアントに送り返します。クライアントがJWTを受信すると、JWTを保存し、将来のリクエストごとにアプリケーションに使用します。
単純なシナリオの場合、ユーザーは1つのリソースのみを要求できます。それはあまり役に立たず、リクエスト時に現在のタイムスタンプを含む文字列を返すだけです。
リクエストを行うときにJWTを使用する方法はいくつかあります。当社のアプリケーションでは、JWTはBearer Authorization Headerに送信されます。
Bearer Authorizationに慣れていない場合、これはリクエストヘッダーでトークン(JWTなど)が送信されるHTTP認証の形式です。サーバーはトークンをチェックし、トークンへの「ホルダー」アクセスを許可するかどうかを判断できます。
これはヘッダーの例です:
<code>{ "iat": 1416929109, "jti": "aa7f8d0a95c", "scopes": [ "repo", "public_repo" ] }</code>
JWT
は、セッションCookieを置き換えることを意図していないことに注意してください。 前提条件
プロジェクトのルートディレクトリで、Composerインストールを実行します。これにより、JWT操作を簡素化するサードパーティライブラリであるFirebase Php-JWTと、アプリケーションの構成データへのアクセスを簡素化するためにLaminas-Configが導入されます。
ログインフォーム
写真ライブラリをインストールした後、Authenticate.phpでログインコードを徐々に記入しましょう。最初に、作曲家によって生成されたオートローダーが利用可能であることを確認するために、通常のセットアップを作成します。
<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
<code>{ "alg": "HS256", "typ": "JWT" }</code>
指摘する価値のあるもう1つのことは、$ SecretKeyがこのように初期化されていないことです。環境に設定して抽出したり、PhpDotenvなどのライブラリを使用したり、構成ファイルに設定したりする場合があります。この場合、JWTコードに集中したいので、これを行うことは避けています。
漏れたり、バージョン制御の下に保管したりしないでください!
ペイロードデータを準備した後、次にPHP-JWTの静的エンコードメソッドを使用してJWTを作成します。
<code>{ "iat": 1416929109, "jti": "aa7f8d0a95c", "scopes": [ "repo", "public_repo" ] }</code>
配列をjson
に変換しますペイロード情報
を使用しています
<code>Authorization: Bearer ab0dde18155a43ee83edba4a4542b973</code>
クライアントがトークンを持っているので、JavaScriptまたは好きなメカニズムを使用して保存できます。ネイティブJavaScriptを使用して操作する方法の例を次に示します。 index.htmlでは、フォームが正常に送信された後、受信したJWTがメモリに保存され、ログインフォームが非表示になり、タイムスタンプが表示されるボタンが表示されます。 jwt
を使用しています[現在のタイムスタンプの取得]ボタンをクリックすると、承認ヘッダーの認証後に受け取ったJWTを設定するResource.phpにgetリクエストが発行されます。
<?php declare(strict_types=1); use Firebase\JWT\JWT; require_once('../vendor/autoload.php');
jwt
<?php // 从请求中提取凭据 if ($hasValidCredentials) {
最後に、PHPでトークンを検証する方法を見てみましょう。いつものように、作曲家のオートローダーを含めます。その後、正しいリクエスト方法が使用されているかどうかを確認できます。 JWT固有のコードに焦点を合わせ続けるために、これを行うコードをスキップしました。
$secretKey = 'bGS6lzFqvvSQ8ALbOxatm7/Vk7mLQyzqaS34Q4oR1ew='; $issuedAt = new DateTimeImmutable(); $expire = $issuedAt->modify('+6 minutes')->getTimestamp(); // 添加60秒 $serverName = "your.domain.name"; $username = "username"; // 从过滤后的POST数据中检索 $data = [ 'iat' => $issuedAt->getTimestamp(), // 颁发时间:生成令牌的时间 'iss' => $serverName, // 颁发者 'nbf' => $issuedAt->getTimestamp(), // 不早于 'exp' => $expire, // 过期 'userName' => $username, // 用户名 ];
ここで使用している正規表現は、ベアラーヘッダーからトークンを抽出し、他のすべてをダンプしようとします。見つからない場合は、HTTP 400エラー要求が返されます:
デフォルトでは、ApacheはHTTP_AuthorizationヘッダーをPHPに渡さないことに注意してください。その背後にある理由は、
です<?php // 将数组编码为JWT字符串。 echo JWT::encode( $data, $secretKey, 'HS512' ); }
基本的な認証ヘッダーは、接続がHTTPSで完了した場合にのみ安全です。そうしないと、エンコードされたプレーンテキスト(暗号化されていない)のネットワークを介してクレデンシャルが送信されるためです。これは大きなセキュリティの問題です。
この決定の論理を完全に理解しています。ただし、多くの混乱を避けるために、Apache構成に次のことを追加します。その後、コードは予想どおりに機能します。 nginxを使用している場合、コードは予想どおりに機能する必要があります:
<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
次に、$ MATCES変数の2番目の要素になる一致するJWTを抽出しようとします。利用できない場合は、JWTが抽出されず、HTTP 400エラーリクエストが返されます。
<code>{ "alg": "HS256", "typ": "JWT" }</code>
それが正常にデコードされる可能性がある場合、それを検証しようとします。ここでの私の例は、発行者のみを使用しているため、タイムスタンプよりも早く、期限切れになっているため、非常に簡単です。実際のアプリケーションでは、他の多くのステートメントを使用することもできます。
トークンの有効期限が切れているように、トークンが無効である場合、ユーザーはHTTP 401不正ヘッダーを受け取り、スクリプトが終了します。デコードと検証プロセスが失敗した場合、
<code>{ "iat": 1416929109, "jti": "aa7f8d0a95c", "scopes": [ "repo", "public_repo" ] }</code>
提供されるセグメントの数は、上記の標準の3つのセグメントと一致しません。
ヘッダーまたはペイロードは有効なJSON文字列ではありません。
これは、JSON Webトークン(またはJWT)の簡単な紹介と、PHPベースのアプリケーションでそれらを使用する方法です。ここから、次のAPIでJWTを実装してみてください。RS256などの非対称キーを使用する他の署名アルゴリズムを試すか、既存のOAUTH2認証サーバーに統合してAPIキーとして使用します。 コメントや質問がある場合は、Twitterからお気軽にお問い合わせください。
PHP承認にJWTを使用するFAQ PHPでJWTを使用できますか?PHPでJWTを使用して、Webアプリケーションで認証と承認のメカニズムを確立することができます。開始するには、Composerを使用して、「Firebase/PHP-JWT」や「Lcobucci/JWT」などのPHP JWTライブラリをインストールする必要があります。これらのライブラリは、JWTを作成、エンコード、デコード、および検証するために必要なツールを提供します。 JWTを作成するには、ライブラリを使用して、発行者、視聴者、有効期限などのステートメントを含むトークンを構築できます。作成したら、キーでトークンに署名できます。 JWTを受け取るときは、ライブラリを使用してデコードして検証して、その信ity性を確保することができます。トークンが有効で検証されている場合は、宣言にアクセスしてユーザーのIDとアクセス許可を決定し、PHPアプリケーションに安全な認証と承認を実装できるようにします。 鍵を保護し、JWTを使用する場合のセキュリティベストプラクティスに従うことは、アプリケーションリソースへの不正アクセスを防ぐために重要です。
JWTを使用してPHP APIを保護する方法は?
以上がJWT(JSON Web Tokens)によるPHP認証の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。