ホームページ > バックエンド開発 > PHPチュートリアル > JWT(JSON Web Tokens)によるPHP認証

JWT(JSON Web Tokens)によるPHP認証

Christopher Nolan
リリース: 2025-02-08 09:57:09
オリジナル
839 人が閲覧しました

PHP Authorization with JWT (JSON Web Tokens)

アプリケーション認証は、ユーザー名/メールボックスやパスワードなどの資格情報のみに依存するために使用され、セッションはユーザーがログアウトするまでユーザーのステータスを維持するために使用されました。その後、認証APIの使用を開始しました。最近、JSON Web Tokens(JWT)がサーバーリクエストの認証にますます使用されています。

この記事では、JWTとは何か、JWTベースのユーザーリクエスト認証にPHPを使用する方法を紹介します。

キーポイント

  1. 認証方法の進化:この記事では、従来のセッションからJSON Web Tokens(JWT)の使用まで、ユーザー認証方法の進化の概要を示しています。セッション管理が行われます。
  2. JWTの利点とアプリケーション:
  3. この記事では、情報やメタデータを保存する能力、OAUTH2との互換性、期限切れのコントロールの提供など、他の認証方法よりもJWTの利点を説明し、説明します。 JWTがユーザー認証プロセスのセキュリティと柔軟性を高める方法。 PHPの実用的なアプリケーション:この記事では、JWTの生成、使用、検証をカバーするPHPベースのアプリケーションにJWTを実装するための包括的なガイドを提供します。これには、詳細なコードの例と説明が含まれ、読者にJWTベースの認証を独自のWebプロジェクトに統合するための明確なロードマップを提供します。
  4. jwtおよびセッション

まず第一に、なぜ会話がそれほど良くないのですか?主な理由は3つあります データは、単純なテキストでサーバーに保存されます。データが通常パブリックフォルダーに保存されていなくても、十分なサーバーアクセスを持つ人なら誰でもセッションファイルのコンテンツを読み取ることができます。

ファイルシステムの読み取り/書き込みリクエストが含まれます。セッションが開始されるか、そのデータが変更されるたびに、サーバーはセッションファイルを更新する必要があります。アプリがセッションクッキーを送信するたびに同じことが言えます。ユーザーの数が多い場合、MemcachedやRedisなどの代替セッションストレージオプションを使用しない限り、サーバーが遅くなる可能性があります。

    分散/クラスター化アプリケーション。セッションファイルはデフォルトでファイルシステムに保存されるため、利用可能な高度に利用可能なアプリケーション(ロードバランサーやクラスター化されたサーバーなどのテクノロジーが必要)のために、分散またはクラスター化されたインフラストラクチャを構築することは困難です。他のストレージメディアと特別な構成を実装する必要があり、その意味を完全に理解する必要があります。
  • jwt
さあ、JWTの学習を始めましょう。 JSON Webトークン仕様(RFC 7519)は、2010年12月28日に初めてリリースされ、最新のアップデートは2015年5月でした。

JWTには、以下を含むAPIキーよりも多くの利点があります

  • APIキーはランダムな文字列であり、JWTには情報とメタデータが含まれています。この情報とメタデータは、ユーザーのID、承認データ、およびドメインに対するトークンの有効性など、さまざまなコンテンツを説明する場合があります。
  • JWTは、集中的な発行または取り消し機関を必要としません。
  • JWTはOAUTH2と互換性があります。
  • JWTデータを確認できます。
  • JWTは制御の有効期限が切れています。
  • JWTは、HTTP認証ヘッダーなど、スペースが制約した環境に適しています。
  • データはJavaScriptオブジェクト表記(JSON)形式で転送されます。
  • JWTは、base64urlエンコードを使用して表されます。

jwtはどのように見えますか?

これはJWTの例です

<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
一見すると、この文字列は、ピリオドまたはドット文字に接続されたキャラクターのランダムなグループのようです。したがって、APIキーと違いはないようです。ただし、よく見ると、3つの文字列があることがわかります。

jwtヘッダー

最初の文字列はJWTヘッダーです。 Base64 URLエンコードJSON文字列です。これは、常にJWTに設定されている署名とトークンのタイプを生成するために使用される暗号化アルゴリズムを指定します。アルゴリズムは、または非対称にすることができます。 対称アルゴリズムは、単一のキーを使用してトークンを作成および検証します。このキーは、JWTの作成者と消費者の間で共有されます。作成者と消費者のみがキーを知っていることを確認してください。それ以外の場合、誰でも有効なトークンを作成できます。

非対称アルゴリズムは、秘密鍵を使用してトークンに署名し、公開キーを使用してトークンを確認します。これらのアルゴリズムは、共有キーが非現実的である場合、または他の当事者がトークンの完全性を検証するだけである場合に使用する必要があります。 JWTのペイロード

2番目の文字列はJWTのペイロードです。また、Base64 URLエンコードJSON文字列でもあります。 「宣言」と呼ばれるいくつかの標準フィールドが含まれています。宣言には3種類のタイプがあります:

登録

public

private 登録明細書は事前に定義されています。 JWTのRFCでそれらのリストを見つけることができます。一般的に使用されるステートメントをいくつか紹介します:

IAT:トークンによって発行された日付とタイムスタンプ。

キー:トークンの検証に使用できる一意の文字列ですが、これは集中化されていない発行者機関に反します。
  • ISS:発行者の名前または識別子を含む文字列。他のアプリケーションからトークンを破棄するために使用できるドメイン名にすることができます。
  • NBF:トークンは有効な日付とタイムスタンプと見なされるようになります。 IAT以上である必要があります。
  • exp:トークンが有効に停止する日付とタイムスタンプ。 IATおよびNBFより大きくする必要があります。
  • 必要に応じて公開宣言を定義できます。ただし、登録された声明や既に存在する公式声明と同じではありません。好きなようにプライベートステートメントを作成できます。彼らは両方の当事者のみです:生産者と消費者。
  • jwtの署名

JWTの署名は、トークンのコンテンツに固有のデジタル署名を使用してJWTのデータを保護するように設計された暗号化メカニズムです。署名により、JWTの完全性が保証され、ユーザーが悪意のある俳優によって改ざんされていないことを確認できます。

JWTの署名は、3つのことの組み合わせです
  • jwtのヘッダー
  • JWTのペイロード
  • 秘密の値

これら3つは、JWTヘッダー(非暗号化されていない)で指定されたアルゴリズムを使用してデジタル署名されています。上記の例をデコードすると、次のJSON文字列が取得されます。

jwtのヘッダー

<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
JWTのデータ

<code>{
    "alg": "HS256",
    "typ": "JWT"
}</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
自分でjwt.io自分で試すことができます。ここでは、自分のjwtをエンコードしてデコードすることができます。

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>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
アプリケーションが受信するすべてのリクエストについて、PHPはベアラーヘッダーからトークンを抽出しようとします。それが存在する場合、それは検証されます。有効な場合、ユーザーはリクエストに対する通常の応答が表示されます。ただし、JWTが無効である場合、ユーザーはリソースにアクセスすることができません。

JWT

は、セッションCookieを置き換えることを意図していないことに注意してください。 前提条件

まず、システムにPHPと作曲家をインストールする必要があります。

プロジェクトのルートディレクトリで、Composerインストールを実行します。これにより、JWT操作を簡素化するサードパーティライブラリであるFirebase Php-JWTと、アプリケーションの構成データへのアクセスを簡素化するためにLaminas-Configが導入されます。

ログインフォーム

写真

ライブラリをインストールした後、Authenticate.phpでログインコードを徐々に記入しましょう。最初に、作曲家によって生成されたオートローダーが利用可能であることを確認するために、通常のセットアップを作成します。

<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
フォームの提出を受信した後、資格情報はデータベースまたは他のデータストアに対して検証されます。この例の目的のために、それらが有効であると仮定し、$ hasvalidcredentialssをtrueに設定します。

<code>{
    "alg": "HS256",
    "typ": "JWT"
}</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
次に、変数のセットを初期化してJWTを生成します。 JWTをクライアントに確認できるため、機密情報を含めないでください。

指摘する価値のあるもう1つのことは、$ SecretKeyがこのように初期化されていないことです。環境に設定して抽出したり、PhpDotenvなどのライブラリを使用したり、構成ファイルに設定したりする場合があります。この場合、JWTコードに集中したいので、これを行うことは避けています。

漏れたり、バージョン制御の下に保管したりしないでください!

ペイロードデータを準備した後、次にPHP-JWTの静的エンコードメソッドを使用してJWTを作成します。

<code>{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
この方法:

配列をjson

に変換します
    ヘッダーを生成
  • ペイロードに署名
  • 最終文字列のエンコード
  • 3つのパラメーターを受け入れます:

ペイロード情報

    key
  • トークンに署名するためのアルゴリズム
  • 関数の結果でエコーを呼び出すことにより、生成されたトークンを返します:
jwt

を使用しています

<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が有効であると仮定すると、リソースが表示され、その後、コンソールに応答が記述されます。

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,                     // 用户名
];
ログイン後にコピー
コードは、ベアラーヘッダーからトークンを抽出しようとします。 preg_matchを使用してこれを行いました。関数に慣れていない場合、文字列上で正規表現マッチングを実行します。

ここで使用している正規表現は、ベアラーヘッダーからトークンを抽出し、他のすべてをダンプしようとします。見つからない場合は、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>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
このポイントに到達すると、JWTが抽出されているため、デコードと検証フェーズに進みます。これを行うには、環境またはアプリケーションの構成から抽出されるキーが再度必要です。次に、PHP-JWTの静的デコード法を使用して、JWTのデコードに使用されるキーと一連のアルゴリズムであるJWTに渡します。

それが正常にデコードされる可能性がある場合、それを検証しようとします。ここでの私の例は、発行者のみを使用しているため、タイムスタンプよりも早く、期限切れになっているため、非常に簡単です。実際のアプリケーションでは、他の多くのステートメントを使用することもできます。

トークンの有効期限が切れているように、トークンが無効である場合、ユーザーはHTTP 401不正ヘッダーを受け取り、スクリプトが終了します。

デコードと検証プロセスが失敗した場合、
<code>{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}</code>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

提供されるセグメントの数は、上記の標準の3つのセグメントと一致しません。

ヘッダーまたはペイロードは有効なJSON文字列ではありません。
  • 署名は無効です。つまり、データは改ざんされています!
  • NBF宣言はJWTで設定されており、そのタイムスタンプは現在のタイムスタンプよりも小さいです。
  • IAT宣言はJWTで設定されており、そのタイムスタンプは現在のタイムスタンプよりも小さいです。
  • Exp宣言はJWTで設定されており、そのタイムスタンプは現在のタイムスタンプよりも大きい。
  • ご覧のとおり、JWTには、有効なトークンのリストを手動で取り消したりチェックしたりすることなく、無効としてマークできるコントロールの素晴らしいセットがあります。
  • デコードと検証プロセスが成功した場合、ユーザーはリクエストを発行することが許可され、対応する応答が表示されます。

概要

これは、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を使用する場合のセキュリティベストプラクティスに従うことは、アプリケーションリソースへの不正アクセスを防ぐために重要です。

PHPのJWT認証とは何ですか?

PHPでのJWT(JSON Webトークン)認証は、Webアプリケーションでユーザー認証と承認を実装するために広く使用されている方法です。これは、トークン認証に基づいており、安全でステートレスのユーザー認証を可能にします。 JWT認証がPHPでどのように機能するかは次のとおりです。 まず、ユーザー認証またはログイン中に、サーバーはJWTを生成します。これは、ユーザーID、ユーザー名、ロールなど、ユーザーに関連するコンパクトで自己完結型のトークンを含む情報(クレーム)を生成します。これらの宣言は通常、JSONデータです。次に、サーバーはこのトークンにキーで署名し、その完全性と信頼性を確保します。 第二に、認証が成功した後、サーバーはJWTをクライアントに送り返します。クライアントは通常、HTTP Cookieやローカルストレージなどの安全な場所に保存されます。このトークンは、認証の証明として機能します。 最後に、サーバー上のリソースを保護した後続の要求のために、クライアントは通常、「承認」ヘッダーを「ベアラー」スキームで使用して、JWTをリクエストヘッダーに追加します。 JWTを受信した後、サーバーはトークン作成中に使用される同じキーを使用して、その署名を確認します。さらに、トークンが期限切れになっておらず、有効な宣言が含まれているかどうかを確認します。検証が成功した後、トークン宣言からユーザー情報を抽出し、承認ロジックを実施して、ユーザーが要求されたリソースにアクセスするために必要な権限を持っていることを確認します。このアプローチにより、サーバー側のセッションストレージなしでPHPアプリケーションで安全でステートレス認証が可能になります。 PHPでのJWT認証は、スケーラビリティやステートレス性などの多くの利点を提供しますが、キーを保護し、トークン管理を採用するためのベストプラクティスは、アプリケーションのセキュリティを維持するために不可欠です。確立されたPHP JWTライブラリを使用すると、トークン処理を簡素化し、セキュリティを強化できます。

PHPのJWTの代替案は何ですか?

PHPでの認証と承認のためのJWT(JSON Web Tokens)の代替案は、セッションベースの認証です。セッションベースの認証では、サーバーは、認証されたユーザーごとに1つのセッションを維持します。ユーザーがログインすると、一意のセッション識別子が作成されます(通常、クライアントブラウザーにセッションCookieとして保存されます)。この識別子は、ユーザーID、ユーザー名、許可など、ユーザーに関連する情報を含む、ユーザーをサーバー側のセッションデータに関連付けるために使用されます。 セッションベースの認証は、実装のシンプルさと容易さを提供し、特にJWTのステートレスでスケーラブルな機能が必要ない場合は、さまざまなWebアプリケーションに適しています。本質的には、ユーザーセッション中にユーザー固有のデータ(ショッピングカートのコンテンツやユーザーの好みなど)を管理する必要がある場合に有利になる可能性があります。 ただし、セッションベースの認証を使用する際に考慮すべきことがいくつかあります。ステートレス認証を必要とする分散またはマイクロサービスベースのアーキテクチャにはあまり適用できない場合があります。さらに、ユーザーセッションの管理は、特により大きなユーザーベースを持つアプリケーションでサーバーの負荷を増加させる可能性があります。最終的に、PHPでJWTとセッションベースの認証を選択することは、アプリケーションの特定のニーズと設計上の考慮事項と一致する必要があります。

JWTを使用してPHP APIを保護する方法は?

PHP APIをJWT(JSON Webトークン)で保護するには、認証と承認を組み合わせたマルチステッププロセスが含まれます。まず、適切なPHP JWTライブラリ(「Firebase/PHP-JWT」や「Lcobucci/JWT」など)を選択して、トークン関連の操作を処理し、コンポーザーを使用して依存関係を管理します。 認証のために、PHPアプリケーションにユーザー認証システムを実装する必要があります。このシステムは、データベースまたは認証プロバイダーに対してユーザー資格情報を検証します。認証が成功した後、ユーザーのID、ユーザー名、ロールなどのユーザー関連のクレームを含むJWTトークンを生成します。トークンの有効性を制御するために有効期限を設定し、キーでトークンに署名してください。この署名されたトークンは、認証応答の一部としてクライアントに送り返されます。 クライアントは、通常はHTTP Cookieまたはローカルストレージに、受信したJWTを安全に保存します。その後のAPIリクエストの場合、クライアントは「Bearer」スキームを備えた「承認」ヘッダーとして、リクエストヘッダーにJWTを含めます。 PHP APIでは、トークンを作成するときに使用される同じキーを使用してその署名を確認することにより、着信JWTを確認できます。さらに、トークンが期限切れになっておらず、有効な宣言が含まれていることを確認します。検証が成功した後、トークン宣言からユーザー情報を抽出し、認証ロジックを実装して、ユーザーが要求されたリソースにアクセスするために必要なアクセス許可を確実に持っていることを確認します。 キーを安全に保つことは、トークンに署名して検証することが重要であるため、重要です。このキーの漏れは、深刻なセキュリティの脆弱性につながる可能性があります。

以上がJWT(JSON Web Tokens)によるPHP認証の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート