Evan Sims による
このガイドでは、Auth0 PHP SDK を使用して、PHP バックエンド API に Auth0 を統合する方法を説明します。アカウント用に設定された例を使ってこのクイックスタートを進められるよう、ログインしたうえで読み進めることをお勧めします。
Auth0 Dashboard の APIs セクションで、Create API をクリックします。API の名前と識別子を入力します。たとえば https://quickstarts/api です。この識別子は、後でアクセストークンの検証を設定する際に audience として使用します。Signing Algorithm は RS256 のままにします。
デフォルトでは、API はトークンの署名アルゴリズムとして RS256 を使用します。RS256 は秘密鍵と公開鍵のキーペアを使用するため、Auth0 アカウントの公開鍵を使ってトークンを検証します。公開鍵は JSON Web Key Set (JWKS) 形式で提供されており、こちら からアクセスできます。
権限を使用すると、特定のアクセストークンを使ってユーザーに代わりリソースにどのようにアクセスできるかを定義できます。たとえば、ユーザーが manager アクセスレベルの場合は messages リソースへの読み取りアクセスを許可し、administrator アクセスレベルの場合はそのリソースへの書き込みアクセスを許可するように設定できます。
許可する権限は、Auth0 Dashboard の APIs セクションにある Permissions ビューで定義できます。
この例では、read:messages スコープを使用します。
この例では、次の内容を示します。
Auth0 が署名したトークンを、PHP で作成したバックエンド API で認可するサンプルアプリケーションを作成してみましょう。ここでは、ドキュメント向けにシンプルな方法を採用します。より堅牢な例については、GitHub の Quickstart app on GitHub も参照してください。
HTTPクライアントとメッセージファクトリーのインストール
Auth0 PHP SDK は、プロジェクトのアーキテクチャとの相互運用性を最大限に高めるために、多くの PHP-FIG 標準をサポートしています。特に重要なのが PSR-17 と PSR-18 です。これらの標準により、メッセージやリクエストの処理に使用するネットワークコンポーネントを自由に組み込めます。SDK で使用するには、互換性のあるライブラリをプロジェクトにインストールする必要があります。
PHP で最も広く使われているネットワークライブラリは Guzzle ですが、PHP コミュニティにはほかにも多くの選択肢があります。このサンプルアプリケーションでは Guzzle を使用します:
composer require guzzlehttp/guzzle guzzlehttp/psr7 http-interop/http-factory-guzzle
Auth0 PHP SDK を利用するには、PHP の依存関係管理ツールである Composer が必要です。Composer を使うと、プロジェクトに必要な依存ライブラリを定義し、それらをインストールできます。続行する前に、Composer がインストール済みで、シェルから利用できることを確認してください。
Auth0 PHP SDK をインストールするには、プロジェクトディレクトリで次のシェルコマンドを実行します。
composer require auth0/auth0-php
これにより、プロジェクト内に vendor フォルダーが作成され、Auth0 PHP SDK の使用に必要な依存関係がすべてダウンロードされます。また、サンプルで使用する vendor/autoload.php ファイルも作成されます。このファイルは、アプリケーションの動作に必要なすべてのクラスを読み込むために使用されます。SDK を動作させるには、このオートロードファイルをプロジェクト内で require することが重要です。
まず、サンプルアプリケーションの設定を保存するため、プロジェクトディレクトリのルートに .env ファイルを作成し、環境変数を設定します。
PHP は .env ファイルを単体では読み取れないため、それを補うライブラリをインストールします。ここではサンプルアプリケーションの都合上、特定のライブラリを使用しますが、実際のアプリケーションでは任意の dotenv ローダーを使用できます。プロジェクトディレクトリで、次のシェルコマンドを実行してライブラリをインストールします。
composer require vlucas/phpdotenv
次に、これらのコードサンプルで使用するPHPソースファイル index.php を作成し、サンプルアプリケーション向けにAuth0 PHP SDKのインスタンスを設定しましょう。
<?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,
]);
このサンプルアプリケーションでは、認可に重点を置いています。認可のためにバックエンド API へアクセスする前にユーザーを認証する方法はいくつかあり、たとえば Auth0 の SPA.js ライブラリ を使用できます。このアプローチは、この Quickstart アプリに対応する GitHub プロジェクトで紹介しています。どのアプローチを採用する場合でも、このサンプルアプリケーションを動作させるには、リクエストパラメーターまたはヘッダー経由でアクセストークンを渡す必要があります。
まず、受信した HTTP リクエストから JSON Web Token (JWT) を抽出する必要があります。GET リクエストの ?token パラメーター、または HTTP_AUTHORIZATION か Authorization ヘッダーを確認します。
// 👆 上記の手順から続きます。index.php ファイルに追記してください。
$jwt = $_GET['token'] ?? $_SERVER['HTTP_AUTHORIZATION'] ?? $_SERVER['Authorization'] ?? 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 ルーティングの設定によって、これらのチェックの組み込み方は多少異なる場合がありますが、原則は同じです。トークンを確認し、API エンドポイントで認可が必要な場合は、トークンが有効でない、または受け入れ可能でなければアクセスを拒否します。
// 👆 上記の手順から続きます。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);
これは動作しますが、実際のアプリケーションでは、不要なネットワークリクエストでアプリケーションが遅くなったり、Auth0 のレート制限に達したりしないよう、キャッシュを使用するのが一般的です。Auth0 PHP SDK は、PSR-6 と呼ばれるキャッシュインターフェイスをサポートしているため、互換性のある任意のキャッシュライブラリ を組み込んで、SDK をアーキテクチャに自然に適合させることができます。
このサンプルでは、Symfony Cache コンポーネント ライブラリを使用します。プロジェクトのルートディレクトリから、次のシェルコマンドを実行します。
composer require symfony/cache
次に、SDK がこれを使用するように SdkConfiguration を更新します。
// ✋ SDKがキャッシュを使用できるよう、上記の手順で追加したトークン処理の前にこれを挿入してください。
$tokenCache = new \Symfony\Component\Cache\Adapter\FilesystemAdapter();
$auth0->configuration()->setTokenCache($tokenCache);
これで、サンプルアプリケーションはトークン関連のネットワークリクエストをキャッシュするようになります。