> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# PHP API

export const AuthCodeBlock = ({filename, icon, language, highlight, children}) => {
  const [displayText, setDisplayText] = useState(children);
  const [copyText, setCopyText] = useState(children);
  const wrapperRef = React.useRef(null);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      if (!window.autorun || !window.rootStore) {
        return;
      }
      unsubscribe = window.autorun(() => {
        let processedChildrenForDisplay = children;
        let processedChildrenForCopy = children;
        for (const [key, value] of window.rootStore.variableStore.values.entries()) {
          const escapedKey = key.replaceAll(/[.*+?^${}()|[\]\\]/g, (String.raw)`\$&`);
          let displayValue = value;
          if (key === "{yourClientSecret}" && value !== "{yourClientSecret}") {
            displayValue = value.substring(0, 3) + "*****MASKED*****";
          }
          processedChildrenForDisplay = processedChildrenForDisplay.replaceAll(new RegExp(escapedKey, "g"), displayValue);
          processedChildrenForCopy = processedChildrenForCopy.replaceAll(new RegExp(escapedKey, "g"), value);
        }
        setDisplayText(processedChildrenForDisplay);
        setCopyText(processedChildrenForCopy);
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  useEffect(() => {
    if (!wrapperRef.current) return;
    const originalWriteText = navigator.clipboard.writeText.bind(navigator.clipboard);
    let isOverriding = false;
    const handleClick = e => {
      const button = e.target.closest('[data-testid="copy-code-button"]');
      if (!button || !wrapperRef.current.contains(button)) return;
      isOverriding = true;
      navigator.clipboard.writeText = text => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
          return originalWriteText(copyText);
        }
        return originalWriteText(text);
      };
      setTimeout(() => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
        }
      }, 100);
    };
    const wrapper = wrapperRef.current;
    wrapper.addEventListener('click', handleClick, true);
    return () => {
      wrapper.removeEventListener('click', handleClick, true);
      if (navigator.clipboard.writeText !== originalWriteText) {
        navigator.clipboard.writeText = originalWriteText;
      }
    };
  }, [copyText]);
  return <div ref={wrapperRef}>
      <CodeBlock filename={filename} icon={icon} language={language} lines highlight={highlight}>
        {displayText}
      </CodeBlock>
    </div>;
};

<div id="by-evan-sims">
  ##### Evan Sims による
</div>

このガイドでは、Auth0 PHP SDK を使用して Auth0 を PHP バックエンド API に統合する方法を説明します。ご自身のアカウント向けに設定されたサンプルを使ってこの Quickstart を進められるよう、あらかじめログインしておくことをお勧めします。

<Info>
  **Auth0 を初めてご利用ですか？** [Auth0 の仕組み](/docs/ja-jp/get-started/auth0-overview)を確認し、OAuth 2.0 フレームワークを使用した [API の認証と認可の実装方法](/docs/ja-jp/get-started/authentication-and-authorization-flow) についてご覧ください。
</Info>

<div id="configure-auth0-apis">
  ## Auth0 API を設定する
</div>

<div id="create-an-api">
  ### API を作成する
</div>

Auth0 Dashboard の [APIs](https://manage.auth0.com/#/apis) セクションで、**Create API** をクリックします。API の名前と identifier を入力します。たとえば `https://quickstarts/api` です。この identifier は、後でアクセストークンの検証を設定する際に `audience` として使用します。**Signing Algorithm** は **RS256** のままにします。

<Frame>![API を作成する](https://cdn2.auth0.com/docs/1.14550.0/media/articles/server-apis/create-api.png)</Frame>

デフォルトでは、API はトークンの署名アルゴリズムとして RS256 を使用します。RS256 は秘密鍵と公開鍵のキーペアを使用するため、Auth0 アカウントの公開鍵を使ってトークンを検証します。公開鍵は [JSON Web Key Set (JWKS)](/docs/ja-jp/secure/tokens/json-web-tokens/json-web-key-sets) 形式で提供されており、[こちら](https://\{yourDomain}/.well-known/jwks.json) からアクセスできます。

<div id="define-permissions">
  ### 権限を定義する
</div>

権限を使用すると、特定のアクセストークンを持つユーザーに代わって、リソースにどのようにアクセスできるかを定義できます。たとえば、ユーザーがマネージャーのアクセスレベルを持っている場合は `messages` リソースへの読み取りアクセスを許可し、管理者のアクセスレベルを持っている場合はそのリソースへの書き込みアクセスを許可する、といった設定が可能です。

許可する権限は、Auth0 Dashboard の [APIs](https://manage.auth0.com/#/apis) セクションにある **Permissions** ビューで定義できます。

<Frame>![権限を設定する](https://cdn2.auth0.com/docs/1.14550.0/media/articles/server-apis/configure-permissions.png)</Frame>

<Info>
  この例では `read:messages` スコープを使用します。
</Info>

この例では、次の内容を示します。

* 受信した HTTP リクエストの `Authorization` ヘッダーに JSON Web トークン (JWT) が含まれているかどうかを確認する方法。
* Auth0 アカウントの [JSON Web Key Set (JWKS)](/docs/ja-jp/secure/tokens/json-web-tokens/json-web-key-sets) を使用して、トークンが有効かどうかを確認する方法。アクセストークンの検証について詳しくは、[Validate Access Tokens](/docs/ja-jp/secure/tokens/access-tokens/validate-access-tokens) を参照してください。

<div id="integrating-your-php-backend-api">
  ## PHP Backend API との連携
</div>

Auth0 が署名したトークンを、PHP で作成したバックエンド API で認可するサンプルアプリケーションを作成してみましょう。ここでは、ドキュメントに適したシンプルな方法で進めます。より堅牢な例については、GitHub 上の [Quickstart app](https://github.com/auth0-samples/auth0-php-api-samples/) もあわせてご確認ください。

<div id="installing-http-client-and-messaging-factories">
  ### HTTPクライアントとメッセージファクトリーのインストール
</div>

Auth0 PHP SDK は、プロジェクトのアーキテクチャとの高い相互運用性を実現するために、多くの PHP-FIG 標準をサポートしています。中でも特に重要なのが [PSR-17](https://www.php-fig.org/psr/psr-17/) と [PSR-18](https://www.php-fig.org/psr/psr-18/) です。これらの標準により、メッセージ処理やリクエスト処理を担うネットワークコンポーネントとして、任意のものを組み込めるようになります。SDK で利用するには、互換性のあるライブラリをプロジェクトにインストールする必要があります。

PHP で最も広く使われているネットワークライブラリは Guzzle ですが、PHP コミュニティには他にも多くの選択肢があります。このサンプルアプリケーションでは Guzzle を使用しましょう。

```bash theme={null}
composer require guzzlehttp/guzzle guzzlehttp/psr7 http-interop/http-factory-guzzle
```

<div id="installing-the-php-sdk">
  ### PHP SDK のインストール
</div>

Auth0 PHP SDK を使用するには、PHP の依存関係管理ツールである [Composer](https://getcomposer.org/doc/00-intro.md#installation-linux-unix-macos) が必要です。Composer を使うと、プロジェクトに必要なライブラリを定義し、それらをインストールできます。先に進む前に、Composer がインストールされており、シェルから利用できることを確認してください。

Auth0 PHP SDK をインストールするには、プロジェクトのディレクトリで次のシェルコマンドを実行します。

```bash theme={null}
composer require auth0/auth0-php
```

これにより、プロジェクト内に `vendor` フォルダーが作成され、Auth0 PHP SDK の使用に必要な依存関係がすべてダウンロードされます。さらに、サンプル内で使用される `vendor/autoload.php` ファイルも作成され、このファイルによってアプリケーションの動作に必要なすべてのクラスが読み込まれます。SDK を動作させるには、この autoload ファイルをプロジェクト内で `require` することが重要です。

<div id="configure-the-sdk">
  ### SDKを設定する
</div>

まず、サンプルアプリケーションの設定を保存するために、プロジェクトのルートディレクトリに `.env` ファイルを作成し、環境変数を入力しましょう。

export const codeExample = `# Auth0 テナントの Domain の URL。
# カスタムドメインを使用している場合は、代わりに必ずその値を設定してください。
AUTH0_DOMAIN='https://{yourDomain}'

# Auth0 アプリケーションの Client ID。
AUTH0_CLIENT_ID='{yourClientId}'

# Auth0 アプリケーションの Client Secret。
AUTH0_CLIENT_SECRET='{yourClientSecret}'

# Auth0 API の Identifier。
AUTH0_AUDIENCE='YOUR_API_IDENTIFIER'`;

<AuthCodeBlock children={codeExample} language="env" />

PHP は `.env` ファイルを単体では読み込めないため、そのためのライブラリをインストールします。サンプルアプリケーションでは特定のライブラリを使用しますが、実際のアプリケーションでは任意の `dotenv` ローダーを使用できます。プロジェクトディレクトリから、次のシェルコマンドを実行してライブラリをインストールしましょう。

```bash lines theme={null}
composer require vlucas/phpdotenv
```

次に、これらのコードサンプルで使用する PHP ソースファイル `index.php` を作成し、サンプルアプリケーション用に Auth0 PHP SDK のインスタンスを設定しましょう。

```php lines theme={null}
<?php

// Composer AutoloaderをインポートしてSDKクラスを使用できるようにする:
require 'vendor/autoload.php';

// .envファイルから環境変数を読み込む:
(Dotenv\Dotenv::createImmutable(__DIR__))->load();

// Auth0クラスを設定でインスタンス化する:
$auth0 = new \Auth0\SDK\Auth0([
    'strategy' => \Auth0\SDK\Configuration\SdkConfiguration::STRATEGY_API,
    'domain' => $_ENV['AUTH0_DOMAIN'],
    'clientId' => $_ENV['AUTH0_CLIENT_ID'],
    'clientSecret' => $_ENV['AUTH0_CLIENT_SECRET'],
    'audience' => ($_ENV['AUTH0_AUDIENCE'] ?? null) !== null ? [trim($_ENV['AUTH0_AUDIENCE'])] : null,
]);
```

<div id="authenticating-the-user">
  ### ユーザーを認証する
</div>

このサンプルアプリケーションでは、[認可](https://auth0.com/intro-to-iam/authentication-vs-authorization/) に重点を置いています。認可のためにユーザーがバックエンド API にアクセスする前に認証する方法はいくつもあり、たとえば [Auth0 の SPA.js ライブラリ](https://github.com/auth0/auth0-spa-js) を使用できます。このアプローチは、[GitHub プロジェクトに付属するこの Quickstart アプリ](https://github.com/auth0-samples/auth0-php-api-samples/) で紹介されています。どの方法を採用する場合でも、このサンプルアプリケーションを動作させるには、リクエストパラメーターまたはヘッダーを通じてアクセストークンを渡す必要があります。

<div id="authorizing-an-access-token">
  ### アクセストークンの認可
</div>

まず、受信した HTTP リクエストから JSON Web トークン (JWT) を取り出す必要があります。GET リクエストの `?token` パラメーター、または `HTTP_AUTHORIZATION` か `Authorization` ヘッダーに含まれているかを確認しましょう。

```php lines theme={null}
// 👆 上記の手順からの続きです。index.phpファイルに追記してください。

$jwt = $_GET['token'] ?? $_SERVER['HTTP_AUTHORIZATION'] ?? $_SERVER['Authorization'] ?? null;
```

次に、token がある場合はデコードしてみましょう：

```php lines theme={null}
// 👆 上記の手順から続きます。index.php ファイルに追記してください。

// トークンが存在する場合、処理します。
if ($jwt !== null) {
    // トークン文字列の前後の空白を除去します。
    $jwt = trim($jwt);

    // Authorization ヘッダーに 'Bearer ' プレフィックスが含まれている場合は削除します。
    if (substr($jwt, 0, 7) === 'Bearer ') {
        $jwt = substr($jwt, 7);
    }

    // トークンのデコードを試みます:
    try {
        $token = $auth0->decode($jwt, null, null, null, null, null, null, \Auth0\SDK\Token::TYPE_TOKEN);
        define('ENDPOINT_AUTHORIZED', true);
    } catch (\Auth0\SDK\Exception\InvalidTokenException $exception) {
        // トークンが無効でした。Auth0 SDK のエラーメッセージを表示します。
        // 実際のアプリケーションでは、独自のエラーメッセージを表示するとよいでしょう。
        die($exception->getMessage());
    }
}
```

API ルーティングの設定によって、これらのチェックの組み込み方は多少異なりますが、原則は同じです。token を確認し、API エンドポイントで認可が必要な場合は、その token が有効でない、または許容できないものであればアクセスを拒否します。

```php lines theme={null}
// 👆 上記の手順から続きます。index.phpファイルに追記してください。

// リクエストは認可されていますか？
if (defined('ENDPOINT_AUTHORIZED')) {
    // JSONレスポンスを返します：
    echo json_encode([
        'authorized' => true,
        'data' => $token->toArray()
    ], JSON_PRETTY_PRINT);

    exit;
}

// HTTP 401 Unauthorizedステータスを発行します：
http_response_code(401);

// JSONレスポンスを返します：
echo json_encode([
    'authorized' => false,
    'error' => [
        'message' => 'You are NOT authorized to be here!'
    ]
], JSON_PRETTY_PRINT);
```

<div id="caching">
  ### キャッシュ
</div>

これでも動作しますが、実際のアプリケーションでは、Auth0 のレート制限に達したり、不要なネットワークリクエストでアプリケーションの動作が遅くなったりしないよう、キャッシュを使用するのが一般的です。Auth0 PHP SDK は [PSR-6](https://www.php-fig.org/psr/psr-6) と呼ばれるキャッシュインターフェースをサポートしており、[互換性のある任意のキャッシュライブラリ](https://packagist.org/providers/psr/cache-implementation) を組み込むことで、SDK をアーキテクチャに自然に適合させることができます。

このサンプルでは、[Symfony Cache コンポーネント](https://symfony.com/doc/current/components/cache.html) ライブラリを使用します。プロジェクトのルートディレクトリから、次のシェルコマンドを実行してください。

```bash lines theme={null}
composer require symfony/cache
```

次に、それを使用するようSDKに指示するため、SdkConfigurationを更新する必要があります:

```php lines theme={null}
// ✋ SDKがキャッシュを使用できるよう、上記のステップで追加したトークン処理の前にこれを挿入してください。

$tokenCache = new \Symfony\Component\Cache\Adapter\FilesystemAdapter();
$auth0->configuration()->setTokenCache($tokenCache);
```

これで、サンプルアプリケーションはトークン関連のネットワークリクエストをキャッシュするようになります。

<Info>
  ##### 次にできること

  | [他のアイデンティティプロバイダーを設定する](/docs/ja-jp/authenticate/identity-providers)                                                        | [多要素認証を有効にする](/docs/ja-jp/secure/multi-factor-authentication) |
  | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- |
  | [攻撃対策について学ぶ](/docs/ja-jp/secure/attack-protection)                                                                          | [ルールについて学ぶ](/docs/ja-jp/customize/rules)                      |
  | [GitHubで編集する](https://github.com/auth0/docs/edit/master/articles/quickstart/backend/aspnet-core-webapi/01-authorization.md) |                                                               |
</Info>

***
