Microsoft Graph とアプリ専用認証を使用して PHP アプリを構築する
このチュートリアルでは、Microsoft Graph API を使用してアプリ専用認証を使用してデータにアクセスする PHP コンソール アプリを構築する方法について説明します。 アプリのみの認証は、組織内のすべてのユーザーのデータにアクセスする必要があるバックグラウンド サービスまたはアプリケーションに適しています。
注:
Microsoft Graph を使用してユーザーの代わりにデータにアクセスする方法については、この ユーザー (委任された) 認証チュートリアルを参照してください。
このチュートリアルの内容:
ヒント
このチュートリアルに従う代わりに、 GitHub リポジトリ をダウンロードまたは複製し、README の指示に従ってアプリケーションを登録し、プロジェクトを構成できます。
前提条件
このチュートリアルを開始する前に、開発用コンピューターに PHP と Composer がインストールされている必要があります。
また、グローバル管理者ロールを持つ Microsoft の職場または学校アカウントも必要です。 Microsoft 365 テナントをお持ちでない場合は、 Microsoft 365 開発者プログラムを通じてテナントの資格を得る可能性があります。詳細については、 FAQ を参照してください。 または、 1 か月間の無料試用版にサインアップするか、Microsoft 365 プランを購入することもできます。
注:
このチュートリアルは、PHP バージョン 8.1.5 と Composer バージョン 2.3.5 で記述されました。 このガイドの手順は、他のバージョンで動作する可能性がありますが、テストされていません。
ポータルでアプリを登録する
この演習では、 アプリのみの認証を有効にするために、Azure Active Directory に新しいアプリケーションを登録します。 アプリケーションは、Microsoft Entra 管理センターを使用するか、 Microsoft Graph PowerShell SDK を使用して登録できます。
アプリケーションをアプリ専用認証に登録する
このセクションでは、 クライアント資格情報フローを使用してアプリのみの認証をサポートするアプリケーションを登録します。
ブラウザーを開き、 Microsoft Entra 管理センター に移動し、グローバル管理者アカウントを使用してログインします。
左側のナビゲーションで [Microsoft Entra ID] を 選択し、[ ID] を展開し、[ アプリケーション] を展開して、[ アプリの登録] を選択します。
[新規登録] を選択します。 アプリケーションの名前 (例:
Graph App-Only Auth Tutorial
) を入力します。[ サポートされているアカウントの種類 ] を [この組織のディレクトリ内のアカウントのみ] に設定します。
[リダイレクト URI]を空のままにします。
[登録] を選択します。 アプリケーションの [概要 ] ページで、 アプリケーション (クライアント) ID と ディレクトリ (テナント) ID の値をコピーして保存します。次の手順でこれらの値が必要になります。
[管理] で、[API のアクセス許可] を選択します。
行で省略記号 (...) を選択し、[アクセス許可の削除] を選択して、[構成されたアクセス許可] の下にある既定の User.Readアクセス許可を削除します。
[ アクセス許可の追加] を選択し、[ Microsoft Graph] を選択します。
[アプリケーションのアクセス許可] を選択します。
[ User.Read.All] を選択し、[ アクセス許可の追加] を選択します。
[ 管理者の同意を付与する] を選択し、[ はい ] を選択して、選択したアクセス許可に対して管理者の同意を提供します。
[管理] で [証明書とシークレット] を選択し、[新しいクライアント シークレット] を選択します。
説明を入力し、期間を選択し、[ 追加] を選択します。
[値] 列からシークレットをコピーします。次の手順で必要になります。
重要
このクライアント シークレットは今後表示されないため、この段階で必ずコピーするようにしてください。
注:
ユーザー認証に登録する手順とは異なり、このセクションではアプリの登録に対する Microsoft Graph のアクセス許可を構成したことに注意してください。 これは、アプリのみの認証で クライアント資格情報フローが使用されるため、アプリの登録でアクセス許可を構成する必要があるためです。 詳細については 、「.default スコープ 」を参照してください。
PHP コンソール アプリを作成する
まず、新しい Composer プロジェクトを初期化します。 プロジェクトを作成するディレクトリでコマンド ライン インターフェイス (CLI) を開きます。 次のコマンドを実行します。
composer init
プロンプトに応答します。 ほとんどの質問の既定値は受け入れますが、次 n
応答できます。
Would you like to define your dependencies (require) interactively [yes]? n
Would you like to define your dev dependencies (require-dev) interactively [yes]? n
Add PSR-4 autoload mapping? Maps namespace "Microsoft\Graphapponlytutorial" to the entered relative path. [src/, n to skip]: n
依存関係のインストール
次に進む前に、後で使用するいくつかの依存関係を追加します。
- Microsoft Graph SDK for PHP を使用して Microsoft Graph を呼び出します。
- .env ファイルから環境変数を読み取るための vlucas/phpdotenv。
CLI で次のコマンドを実行して、依存関係をインストールします。
composer require microsoft/microsoft-graph vlucas/phpdotenv
アプリケーション設定を読み込む
このセクションでは、アプリ登録の詳細をプロジェクトに追加します。
プロジェクトのルート ディレクトリに .env という名前のファイルを作成し、次のコードを追加します。
CLIENT_ID=YOUR_CLIENT_ID_HERE CLIENT_SECRET=YOUR_CLIENT_SECRET_HERE_IF_USING_APP_ONLY TENANT_ID=YOUR_TENANT_ID_HERE_IF_USING_APP_ONLY
次の表に従って値を更新します。
設定 値 CLIENT_ID
アプリ登録のクライアント ID CLIENT_SECRET
アプリ登録のクライアント シークレット TENANT_ID
組織のテナント ID 重要
git などのソース管理を使用している場合は、誤ってアプリ ID が漏洩しないように、ソース管理から .env ファイルを除外することをお勧めします。
アプリを設計する
このセクションでは、簡単なコンソール ベースのメニューを作成します。
プロジェクトのルート ディレクトリに main.php という名前のファイル を作成します。 開く PHP タグと終了 PHP タグを追加します。
<?php ?>
PHP タグの間に次のコードを追加します。
// Enable loading of Composer dependencies require_once realpath(__DIR__ . '/vendor/autoload.php'); require_once 'GraphHelper.php'; print('PHP Graph Tutorial'.PHP_EOL.PHP_EOL); // Load .env file $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); $dotenv->required(['CLIENT_ID', 'CLIENT_SECRET', 'TENANT_ID']); initializeGraph(); $choice = -1; while ($choice != 0) { echo('Please choose one of the following options:'.PHP_EOL); echo('0. Exit'.PHP_EOL); echo('1. Display access token'.PHP_EOL); echo('2. List users'.PHP_EOL); echo('3. Make a Graph call'.PHP_EOL); $choice = (int)readline(''); switch ($choice) { case 1: displayAccessToken(); break; case 2: listUsers(); break; case 3: makeGraphCall(); break; case 0: default: print('Goodbye...'.PHP_EOL); } }
閉じる PHP タグの前に、ファイルの末尾に次のプレースホルダー メソッドを追加します。 後の手順で実装します。
function initializeGraph(): void { // TODO } function displayAccessToken(): void { // TODO } function listUsers(): void { // TODO } function makeGraphCall(): void { // TODO }
これにより、基本的なメニューが実装され、コマンド ラインからユーザーの選択が読み取ります。
アプリ専用認証を追加する
このセクションでは、アプリケーションにアプリのみの認証を追加します。 これは、Microsoft Graph を呼び出すために必要な OAuth アクセス トークンを取得するために必要です。
アプリ専用認証用に Graph クライアントを構成する
このセクションでは、 PhpLeagueAuthenticationProvider
クラスを使用して、 クライアント資格情報フローを使用してアクセス トークンを要求します。
プロジェクトのルート ディレクトリに GraphHelper.php という名前の新しいファイルを作成します。 次のコードを追加します。
<?php class GraphHelper { } ?>
PHP タグ内に次の
using
ステートメントを追加します。use Microsoft\Graph\Core\Authentication\GraphPhpLeagueAccessTokenProvider; use Microsoft\Graph\Generated\Models; use Microsoft\Graph\Generated\Users\UsersRequestBuilderGetQueryParameters; use Microsoft\Graph\Generated\Users\UsersRequestBuilderGetRequestConfiguration; use Microsoft\Graph\GraphServiceClient; use Microsoft\Kiota\Authentication\Oauth\ClientCredentialContext;
GraphHelper
クラスに以下のコードを追加します。private static string $clientId = ''; private static string $clientSecret = ''; private static string $tenantId = ''; private static ClientCredentialContext $tokenContext; private static GraphServiceClient $appClient; public static function initializeGraphForAppOnlyAuth(): void { GraphHelper::$clientId = $_ENV['CLIENT_ID']; GraphHelper::$clientSecret = $_ENV['CLIENT_SECRET']; GraphHelper::$tenantId = $_ENV['TENANT_ID']; GraphHelper::$tokenContext = new ClientCredentialContext( GraphHelper::$tenantId, GraphHelper::$clientId, GraphHelper::$clientSecret); GraphHelper::$appClient = new GraphServiceClient( GraphHelper::$tokenContext, ['https://graph.microsoft.com/.default']); }
main.phpの空の
initializeGraph
関数 を 次のように置き換えます。function initializeGraph(): void { GraphHelper::initializeGraphForAppOnlyAuth(); }
このコードは、.env ファイルから情報を読み込み、 ClientCredentialContext
オブジェクトと GraphServiceClient
オブジェクトの 2 つのプロパティを初期化します。
ClientCredentialContext
オブジェクトは要求の認証に使用され、GraphServiceClient
オブジェクトを使用して Microsoft Graph を呼び出します。
クライアント資格情報フローをテストする
次に、 GraphHelper
からアクセス トークンを取得するコードを追加します。
次の関数を
GraphHelper
クラスに追加します。public static function getAppOnlyToken(): string { // Create an access token provider to get the token $tokenProvider = new GraphPhpLeagueAccessTokenProvider(GraphHelper::$tokenContext); return $tokenProvider ->getAuthorizationTokenAsync('https://graph.microsoft.com') ->wait(); }
main.phpの空の
displayAccessToken
関数 を 次のように置き換えます。function displayAccessToken(): void { try { $token = GraphHelper::getAppOnlyToken(); print('App-only token: '.$token.PHP_EOL.PHP_EOL); } catch (Exception $e) { print('Error getting access token: '.$e->getMessage().PHP_EOL.PHP_EOL); } }
アプリをビルドして実行します。 オプションの入力を求められたら、「
1
」と入力します。 アプリケーションは、環境変数で前に構成した認証情報を使用してフェッチしたアクセス トークンを表示します。$ php main.php PHP Graph Tutorial Please choose one of the following options: 0. Exit 1. Display access token 2. List users 3. Make a Graph call 1 App-only token: eyJ0eXAiOiJKV1QiLCJub25jZSI6IlVDTzRYOWtKYlNLVjVkRzJGenJqd2xvVUcwWS...
ヒント
検証とデバッグ のみを目的として、 https://jwt.msで Microsoft のオンライン トークン パーサーを使用してアプリ専用アクセス トークンをデコードできます。 これは、Microsoft Graph を呼び出すときにトークン エラーが発生した場合に役立ちます。 たとえば、トークン内の
role
要求に、想定される Microsoft Graph アクセス許可スコープが含まれていることを確認します。
ユーザーを一覧表示する
このセクションでは、アプリのみの認証を使用して、Azure Active Directory 内のすべてのユーザーを一覧表示する機能を追加します。
GraphHelper
クラスに以下のコードを追加します。public static function getUsers(): Models\UserCollectionResponse { $configuration = new UsersRequestBuilderGetRequestConfiguration(); $configuration->queryParameters = new UsersRequestBuilderGetQueryParameters(); // Only request specific properties $configuration->queryParameters->select = ['displayName','id','mail']; // Sort by display name $configuration->queryParameters->orderby = ['displayName']; // Get at most 25 results $configuration->queryParameters->top = 25; return GraphHelper::$appClient->users()->get($configuration)->wait(); }
main.phpの空の
listUsers
関数 を 次のように置き換えます。function listUsers(): void { try { $users = GraphHelper::getUsers(); // Output each user's details foreach ($users->getValue() as $user) { print('User: '.$user->getDisplayName().PHP_EOL); print(' ID: '.$user->getId().PHP_EOL); $email = $user->getMail(); $email = isset($email) ? $email : 'NO EMAIL'; print(' Email: '.$email.PHP_EOL); } $nextLink = $users->getOdataNextLink(); $moreAvailable = isset($nextLink) && $nextLink != '' ? 'True' : 'False'; print(PHP_EOL.'More users available? '.$moreAvailable.PHP_EOL.PHP_EOL); } catch (Exception $e) { print(PHP_EOL.'Error getting users: '.$e->getMessage().PHP_EOL.PHP_EOL); } }
アプリを実行し、サインインし、オプション 2 を選択してユーザーを一覧表示します。
Please choose one of the following options: 0. Exit 1. Display access token 2. List users 3. Make a Graph call 2 User: Adele Vance ID: 05fb57bf-2653-4396-846d-2f210a91d9cf Email: AdeleV@contoso.com User: Alex Wilber ID: a36fe267-a437-4d24-b39e-7344774d606c Email: AlexW@contoso.com User: Allan Deyoung ID: 54cebbaa-2c56-47ec-b878-c8ff309746b0 Email: AllanD@contoso.com User: Bianca Pisani ID: 9a7dcbd0-72f0-48a9-a9fa-03cd46641d49 Email: NO EMAIL User: Brian Johnson (TAILSPIN) ID: a8989e40-be57-4c2e-bf0b-7cdc471e9cc4 Email: BrianJ@contoso.com ... More users available? true
コードの説明
getUsers
関数のコードについて考えてみましょう。
- ユーザーのコレクションを取得します。
-
queryParameters->select
を使用して特定のプロパティを要求します -
queryParameters->top
を使用して、返されるユーザーの数を制限します -
queryParameters->orderby
を使用して応答を並べ替える
省略可能: 独自のコードを追加する
このセクションでは、独自の Microsoft Graph 機能をアプリケーションに追加します。 これは、Microsoft Graph ドキュメント または Graph エクスプローラーのコード スニペット、または作成したコードです。 このセクションは省略可能です。
アプリを更新する
GraphHelper
クラスに以下のコードを追加します。public static function makeGraphCall(): void { // INSERT YOUR CODE HERE }
main.phpの空の
makeGraphCall
関数 を 次のように置き換えます。function makeGraphCall(): void { try { GraphHelper::makeGraphCall(); } catch (Exception $e) { print(PHP_EOL.'Error making Graph call'.PHP_EOL.PHP_EOL); } }
API を選択する
試したい API を Microsoft Graph で見つけます。 たとえば、 Create イベント API です。 API ドキュメントの例のいずれかを使用するか、独自の API 要求を作成できます。
アクセス許可を構成する
選択した API のリファレンス ドキュメントの [アクセス許可] セクションを確認して、サポートされている認証方法を確認します。 たとえば、一部の API では、アプリ専用アカウントや個人用 Microsoft アカウントがサポートされていません。
- ユーザー認証を使用して API を呼び出すには (API でユーザー (委任された) 認証がサポートされている場合)、 ユーザー (委任された) 認証 のチュートリアルを参照してください。
- アプリ専用認証を使用して API を呼び出すには (API でサポートされている場合)、Azure AD 管理センターに必要なアクセス許可スコープを追加します。
コードを追加する
GraphHelper.phpの makeGraphCall
関数にコード を追加します。
おめでとうございます。
PHP Microsoft Graph チュートリアルを完了しました。 Microsoft Graph を呼び出す作業アプリが作成されたので、新しい機能を試して追加できます。
- Microsoft Graph PHP SDK で ユーザー (委任) 認証 を使用する方法について説明します。
- Microsoft Graph でアクセスできるすべてのデータについては、 Microsoft Graph の概要 に関するページを参照してください。
PHP サンプル
このセクションに問題がある場合 このセクションを改善できるよう、フィードバックをお送りください。