> ## 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

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 を使用して、PHP アプリケーションに Auth0 を統合する方法を説明します。アカウント用に設定された例を使いながらこの Quickstart を進められるよう、あらかじめログインしておくことをおすすめします。

<Info>
  **Authは初めてですか？** [Auth0 の仕組み](/docs/ja-jp/get-started/auth0-overview)、[従来型Webアプリケーションとの統合方法](/docs/ja-jp/get-started/architecture-scenarios/sso-for-regular-web-apps)、および使用する[プロトコル](/docs/ja-jp/get-started/authentication-and-authorization-flow)についてご覧ください。
</Info>

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

<div id="get-your-application-keys">
  ### アプリケーションのキーを取得する
</div>

Auth0 にサインアップすると、新しいアプリケーションが 1 つ作成されます。あるいは、自分で新しく作成している場合もあります。Auth0 と通信するには、そのアプリケーションに関するいくつかの情報が必要です。これらの情報は、Auth0 Dashboard の [Application Settings](https://manage.auth0.com/#/applications) セクションで確認できます。

<Frame>![アプリケーションのダッシュボード](https://cdn2.auth0.com/docs/1.14550.0/media/articles/dashboard/client_settings.png)</Frame>

必要な情報は次のとおりです。

* **Domain**
* **Client ID**
* **Client Secret**

<Info>
  このページ上部のサンプルをダウンロードした場合は、これらの情報はあらかじめ入力されています。
</Info>

<div id="configure-callback-urls">
  ### コールバック URL を設定する
</div>

コールバック URL とは、ユーザーの認証完了後に Auth0 がそのユーザーをリダイレクトするアプリケーション内の URL のことです。アプリのコールバック URL は、[Application Settings](https://manage.auth0.com/#/applications) の **Allowed Callback URLs** フィールドに追加する必要があります。このフィールドが設定されていないと、ユーザーはアプリケーションにログインできず、エラーが表示されます。

<Info>
  このページ上部からダウンロードしたサンプルプロジェクトを使っている場合、**Allowed Callback URLs** フィールドに追加するコールバック URL は `http://127.0.0.1:3000/` です。
</Info>

<div id="configure-logout-urls">
  ### Logout URLを設定する
</div>

ログアウト URL とは、ユーザーが認可サーバーからログアウトした後に Auth0 がリダイレクトできる、アプリケーション内の URL です。これは `returnTo` クエリパラメータで指定します。アプリケーションのログアウト URL は、[Application Settings](https://manage.auth0.com/#/applications) の **Allowed Logout URLs** フィールドに追加する必要があります。このフィールドが設定されていない場合、ユーザーはアプリケーションからログアウトできず、エラーが表示されます。

<Info>
  このページ上部からダウンロードしたサンプルプロジェクトを使って進めている場合は、**Allowed Logout URLs** フィールドに `http://127.0.0.1:3000` をログアウト URL として追加してください。
</Info>

<div id="integrate-your-php-application">
  ## PHPアプリケーションを統合する
</div>

PHPアプリケーションでユーザーを認証するサンプルアプリケーションを作成してみましょう。ここでは、ドキュメント向けにシンプルな方法を採用します。より本格的な例については、GitHub 上の [Quickstart アプリ](https://github.com/auth0-samples/auth0-php-web-app/) もご覧ください。

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

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

PHP で最も広く使われているネットワークライブラリは [Guzzle](https://docs.guzzlephp.org/) ですが、PHP コミュニティにはほかにも多くの選択肢があります。このサンプルアプリケーションでは Guzzle を使いましょう。今回も、プロジェクトのディレクトリで次のシェルコマンドを実行してください。

```bash lines 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 lines theme={null}
composer require auth0/auth0-php
```

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

<div id="configuring-the-sdk">
  ### SDKの設定
</div>

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

export const codeExample = `# ご利用の Auth0 アプリケーションの Client ID
AUTH0_CLIENT_ID={yourClientId}

# Auth0 テナントの Domain の URL
AUTH0_DOMAIN={yourDomain}

# ご利用の Auth0 アプリケーションの Client Secret
AUTH0_CLIENT_SECRET={yourClientSecret}

# セッション Cookie の暗号化に使用する、長い秘密の値です。
# これはシェルから \`openssl rand -hex 32\` を使って生成できます。
AUTH0_COOKIE_SECRET=

# アプリケーションにアクセスするための URL です。必要に応じて更新してください。
AUTH0_BASE_URL=http://127.0.0.1:3000`;

<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([
    'domain' => $_ENV['AUTH0_DOMAIN'],
    'clientId' => $_ENV['AUTH0_CLIENT_ID'],
    'clientSecret' => $_ENV['AUTH0_CLIENT_SECRET'],
    'cookieSecret' => $_ENV['AUTH0_COOKIE_SECRET']
]);
```

<div id="setting-up-your-application-routes">
  ### アプリケーションのルートを設定する
</div>

最近のPHPアプリケーションでは、ルーティングを使って受信したHTTPリクエストを処理用のコードに渡し、ユーザーがアプリ内の特定の "ページ" にアクセスしたときに何が起こるかを決定します。アプリケーションにルーティングを実装する方法は1つではなく、利用できるライブラリも数多くあります。ここではサンプルアプリケーションの都合上、特定のライブラリを使用しますが、実際のアプリケーションでは自由に別のものを選んでください。

それでは、プロジェクトのディレクトリで、ルーティングライブラリをインストールするために次のシェルコマンドを実行しましょう。

```bash lines theme={null}
composer require steampixel/simple-php-router
```

次に、`index.php` を再度開いて、アプリケーションに実際の機能を持たせましょう。まず、ルーティングライブラリを読み込み、後でサンプルアプリケーション内のいくつかの箇所から参照できるように、各ルートの完全な URL を便宜上名前付き定数として定義します。

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

// ルーターライブラリをインポートします:
use Steampixel\Route;

// ルート定数を定義します:
define('ROUTE_URL_INDEX', rtrim($_ENV['AUTH0_BASE_URL'], '/'));
define('ROUTE_URL_LOGIN', ROUTE_URL_INDEX . '/login');
define('ROUTE_URL_CALLBACK', ROUTE_URL_INDEX . '/callback');
define('ROUTE_URL_LOGOUT', ROUTE_URL_INDEX . '/logout');
```

これで、アプリケーションのルート処理ロジックと SDK 連携の追加に進みます。

<div id="checking-for-a-session">
  ## セッションを確認する
</div>

Auth0 PHP SDK には、ユーザーが認証済みかどうかを確認し、そのプロファイルを取得できる便利なメソッド `getCredentials()` があります。これを index ルートに追加して、ログインしていればユーザープロファイルを表示し、そうでなければログインが必要であることを知らせましょう。

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

Route::add('/', function() use ($auth0) {
  $session = $auth0->getCredentials();

  if ($session === null) {
    // ユーザーはログインしていません。
    echo '<p>Please <a href="/docs/login">log in</a>.</p>';
    return;
  }

  // ユーザーはログインしています。
  echo '<pre>';
  print_r($session->user);
  echo '</pre>';

  echo '<p>You can now <a href="/docs/logout">log out</a>.</p>';
});
```

`user` プロパティのレスポンスは配列なので、ユーザーのプロファイルに含まれるすべてのプロパティにアクセスできます。たとえば、ユーザーのニックネームは `$session->user<a href="https://auth0.com/docs/users/user-profile-structure" target="_blank" rel="noreferrer">nickname` から、メールアドレスは `$session->useremail` から取得できます。この構造は正規化されたユーザープロファイルです。詳しくは[こちら](https://auth0.com/docs/users/normalized-user-profiles)をご覧ください。

ユーザープロファイルの内容は、使用するソーシャルプロバイダーによって異なるため、このアプリケーションのロジック内で特定の値が常に存在すると決めつけてはいけません。たとえば、PHP の `isset` や null 合体演算子などを使って、値が存在する場合もしない場合も適切に処理してください。

```php lines theme={null}
// ✋ これはサンプルアプリケーションに含める必要はありません。あくまで例示です。
$name = $session->user['name'] ?? $session->user['nickname'] ?? $session->user['email'] ?? 'Unknown';
```

<div id="logging-in">
  ## ログイン
</div>

それでは、/login ルートを作成しましょう。このルートでは Auth0 PHP SDK の `login()` メソッドを使ってユーザーセッションを設定し、このユーザーがログインするための Auth0 の Universal Login ページへのカスタマイズ済み URL を返します。

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

Route::add('/login', function() use ($auth0) {
    // ネットワークの問題やその他のトラブルで以前のログインプロセスが中断された際に「invalid state」エラーが発生しないよう、ログインのたびにユーザーセッションをリセットしておくことをお勧めします。
    $auth0->clear();

    // 最後に、ローカルのアプリケーションセッションを設定し、ユーザーをAuth0 Universal Loginページにリダイレクトして認証を行います。
    header("Location: " . $auth0->login(ROUTE_URL_CALLBACK));
    exit;
});
```

<div id="handling-authentication-callback">
  ## 認証コールバックの処理
</div>

ユーザーが Auth0 の Universal Login ページでの認証を終えると、サンプルアプリケーションのコールバックルート `/callback` に戻ります。このステップでは、その処理を行います。

Auth0 からユーザーが戻される際、HTTPリクエストのクエリにはいくつかの重要なパラメーターが含まれます。Auth0 PHP SDK の `exchange()` メソッドがそれらを処理してくれるため、認証フローの完了は簡単です。

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

Route::add('/callback', function() use ($auth0) {
    // SDKで認証フローを完了します:
    $auth0->exchange(ROUTE_URL_CALLBACK);

    // 最後に、ユーザープロファイルを表示するため、エンドユーザーを / インデックスルートにリダイレクトします:
    header("Location: " . ROUTE_URL_INDEX);
    exit;
});
```

<div id="logging-out">
  ## ログアウト
</div>

最後になりますが、ユーザーのログアウトを適切に処理しましょう。Auth0 PHP SDK の `logout()` メソッドは、サンプルアプリケーションのセッションクッキーを削除し、ユーザーを Auth0 の [/logout エンドポイント](https://auth0.com/docs/logout) にリダイレクトします (これにより Auth0 セッションと、ID プロバイダーのセッションがあればそれらもログアウトされます) 。その後、ユーザーは / index ルートに戻ります。

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

Route::add('/logout', function() use ($auth0) {
    // アプリのローカルセッションをクリアし、Auth0のLogoutエンドポイントへリダイレクトしてAuth0 セッションをクリアします。
    header("Location: " . $auth0->logout(ROUTE_URL_INDEX));
    exit;
});
```

<div id="run-your-app">
  ## アプリを実行しましょう！
</div>

最後に、ルーティングミドルウェアが実際にリクエストをルーティングするよう設定する必要があります。

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

// これにより、ルートの設定が完了し、受信するHTTPリクエストのルーティングを開始する準備ができたことをrouterに伝えます:
Route::run('/');
```

これで完了です！新しいアプリケーションを実行する準備が整いました。もう一度、プロジェクトのディレクトリで次のシェルコマンドを実行してください：

```bash lines theme={null}
php -S 127.0.0.1:3000 index.php
```

ブラウザーで [http://127.0.0.1:3000](https://127.0.0.1:3000) を開いて、試してみてください。

<Note>
  ##### 次にできることは？

  | [他のアイデンティティプロバイダーを設定する](/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/native/flutter/01-login.md) |                                                               |
</Note>
