Skip to main content
Auth0 PHP SDK には Auth0\SDK\API\Authentication クラスが用意されており、Authentication API に直接アクセスするためのメソッドを使用できます。なお、このインターフェースはより高度なアプリケーション向けであり、通常、ユーザーセッションを管理する機能は提供していません。ほとんどのユースケースでは、Auth0 base class を使用することをおすすめします。 この記事では、一般的な認証操作の例を紹介します。

前提条件

以下のドキュメントは、インストールおよびスタートガイドのセクションの手順を完了し、そこで提供されているコードを引き続き使用することを前提としています。

Authorization Code Flow

Authorization Code Flow は、ユーザーにアプリケーションへのアクセスを付与するための基本的な方法です。このフローは、Auth0-PHP Basic Use page で使用されているものと同じです。ログインやコールバックの処理をより細かく制御する必要がある場合は、このセクションで Authentication API を直接使用する方法を説明します。 認可コードを生成するには、ユーザーが Auth0 で認証する必要があります。これを行うには、テナントのドメインの /authorize エンドポイントにリダイレクトします。次のコードは、認証が必要なページに記述します。
// 👆 上記「前提条件」にリンクされている「はじめに」ガイドの続きです。そこで作成した index.php ファイルに追記してください。

// PHP セッションをセットアップします。認証済みユーザー用のカスタムセッションストアとして使用します。
session_start();

// セッションが存在しない場合、$user は null になります。存在する場合はユーザーデータが格納されます。
$user = $_SESSION['user'] ?? null;

// ユーザーはすでに認証済みですか?
if ($user === null) {
    // CSRF 対策の値として使用する、暗号学的に安全な疑似乱数バイト列を生成します。
    // 認証後に取得できるよう保存しておきます。
    $_SESSION['state'] = bin2hex(random_bytes(16));

    // 認可 URL を生成し、ユーザーをリダイレクトします。
    header('Location: ' . $auth0->authentication()->getLoginLink($_SESSION['state']));
    exit;
}

echo '<h1>Sensitive data!</h1>';
上記の処理では、次のことを行います。
  1. カスタムセッションハンドラーに、認証済みのユーザー状態が保存されているかどうかを確認します。ユーザーセッションの処理方法は、アプリケーションによって異なる場合があります。
  2. セッションが存在しない場合は、ユーザーを Universal Login ページにリダイレクトしてログインさせる必要があります。
  3. ログインリクエストで state 値を設定し、その後、コールバック URL に code が返されたときにその値を検証します。これは PHP セッションの ‘state’ キーに保存しています。
  4. getLoginLink() の呼び出しでは、適切なレスポンスタイプ (この場合は code) 、リダイレクト URI (アプリケーションがレスポンスを処理する場所。詳細は以下で説明します) 、および state (上記で設定した値) を含む正しい /authorize リンクを生成します。
  5. その後、この URL にリダイレクトし、ユーザーがこちらにリダイレクトされて戻ってくるのを待ちます。
認証後、ユーザーはコールバック URL 経由でアプリケーションにリダイレクトされます。これは次のように処理されます。
// 👆 上記「前提条件」にリンクされている「はじめに」ガイドの続きです。そこで作成した index.php ファイルに追記してください。

// PHP セッションを開始し、比較用に保存した state を取得できるようにします。
session_start();

// リクエストクエリから `code` および `state` パラメーターを取得します(存在する場合)。
$code = filter_var($_GET['code'] ?? null, FILTER_UNSAFE_RAW, FILTER_NULL_ON_FAILURE);
$state = filter_var($_GET['state'] ?? null, FILTER_UNSAFE_RAW, FILTER_NULL_ON_FAILURE);

// リクエストクエリに code が含まれているか確認します。
if ($code === null) {
    die('No authorization code found.');
}

// state が存在するか確認し、ユーザーをリダイレクトする前に生成・保存した値と照合します。
if ($state === null || $state !== $_SESSION['state']) {
    die('Invalid state.');
}

// state の照合が完了したので、保存していた値を破棄します。
unset($_SESSION['state']);

// 返された code と元のリダイレクト URI を使って access_token の取得を試みます(PSR-7 の ResponseInterface が返されます)。
$response = $auth0->authentication()->codeExchange($code);

// レスポンスのステータスコードがエラーを示しているか確認します。
if ($response->getStatusCode() !== 200) {
    die("Code exchange failed.");
}

// JSON レスポンスを PHP 配列にデコードします。
$response = json_decode(response->getBody()->__toString(), true, 512, JSON_THROW_ON_ERROR);

// セッション情報を格納する配列を作成します。
$session = [
    'id_token' => $response['id_token'] ?? null,
    'access_token' => $response['access_token'] ?? null,
    'scope' => $response['scope'] ?? null,
    'refresh_token' => $response['refresh_token'] ?? null,
    'expires_in' => $response['expires_in'] ?? null,
    'user' => null
];

// IDトークンを取得できました。処理を進めます。
if ($session['id_token'] !== null) {
    // Auth0 SDK に含まれる便利なトークン処理ユーティリティを活用します。
    $token = new \Auth0\SDK\Token($auth0->configuration(), $session['id_token'], \Auth0\SDK\Token::TYPE_ID_TOKEN);

    // トークンを検証し、クレームを確認します。チェックが失敗した場合は \Auth0\SDK\Exception\InvalidTokenException がスローされます。
    $token->verify();
    $token->validate();

    $session['user'] => $token->toArray();
}

// 認証済みセッションの状態を保存します。
$_SESSION['user'] = $session;

// 認証フロー成功のデモとして、ユーザーのクレーム/アイデンティティを出力します。
print_r($session['user']);
このプロセスを詳しく見ていきます。
  1. リクエストのクエリで code パラメーターを探します。見つからない場合は、認証を中止します。
  2. state 値があることを確認し、それが生成した値と一致することを確認します。これは CSRF 攻撃を防ぐうえで重要です。
  3. codeExchange() 呼び出しで code の交換を試みます。このとき、認証されたユーザーがアプリケーションに返された際に Auth0 から渡された code を必ず渡します。
  4. これが成功すれば、交換が正常に完了したことがわかり、IDトークン や アクセストークン などの値を取得できます。
  5. IDトークン を検証し、そのクレームをユーザーの識別情報として使用します。
  6. この最後のステップが成功したら、ユーザー情報を保存し、保護されたデータのページにリダイレクトします。

クライアントクレデンシャルフロー

クライアントクレデンシャルフロー を使用すると、ダッシュボードで設定したスコープに基づいて、アプリケーションが特定の API にアクセスできます。これにより、たとえばアプリケーションから を呼び出せます。認証が成功すると、要求した API 用の が発行されます。 まず、アプリケーション設定ページの Advanced settings > Grant Types タブで Client Credentials グラントを有効にします。 次に、API の Settings ページにある Machine to Machine Applications タブで、使用する API に対するアプリケーションの認可を行います。必要なスコープをすべて選択し (ただし必要以上には選択せず) 、Update をクリックします。Settings タブに戻って Identifier の値をコピーします。これを .env ファイル内の AUTH0_MANAGEMENT_AUDIENCE キーに追加する必要があります。 以下の例を使用して、API のアクセストークンをリクエストします。
// 👆 上記「前提条件」にリンクされている「はじめに」ガイドからの続きです。

// クライアントクレデンシャルの交換を開始する:
$response = $auth0->authentication()->clientCredentials([
    'audience' => $_ENV['AUTH0_MANAGEMENT_AUDIENCE']
]);

// レスポンスのステータスコードは失敗を示しているか?
if ($response->getStatusCode() !== 200) {
    die("Code exchange failed.");
}

// JSONレスポンスをPHP配列にデコードする:
$response = json_decode(response->$getBody()->__toString(), true, 512, JSON_THROW_ON_ERROR);

// レスポンスをブラウザに出力する
print_r($response, true);
グラントが正常に行われると、次の内容が表示されます。
Array
(
    [access_token] => eyJ0eXAi...eyJpc3Mi...QoB2c24w
    [scope] => read:users read:clients ...
    [expires_in] => 86400
    [token_type] => Bearer
)
このアクセストークンの使用方法の詳細は、Using the Management API with Auth0-PHPを参照してください。

シングルサインオンのログアウト

session_destroy() でローカルセッションを破棄すれば、アプリケーションからユーザーの認証を解除するには十分ですが、Auth0 上のエンドユーザーのセッションも終了する必要があります。これにより、次回ユーザーに Auth0 のログインフォームが表示された際、ログインするには認証情報の入力が必要になります。 まず、ログアウト完了後にユーザーをどこへリダイレクトするかを決めます。これを、Auth0 Application の設定にある “Allowed Logout URLs” フィールドに保存します。また、この URL を値として、.env ファイルに AUTH0_LOGOUT_RETURN_URL キーを追加します。 次の内容をアプリケーションのログアウトコードに追加します。
// 👆 上記「前提条件」にリンクされている「はじめに」ガイドからの続きです。

// アプリケーション内のユーザーのローカルセッションを無効化します。
session_destroy();

// Auth0のログアウトURLにリダイレクトして、Auth0セッションを終了します。
header("Location: " . $auth0->authentication()->getLogoutLink($_ENV['AUTH0_LOGOUT_RETURN_URL']);

関連情報