LaravelでM365統合: Graph APIの事前準備ガイド

Azure
この記事は約9分で読めます。

最近LaravelでプロジェクトにM365との連携機能を追加するといった案件が有り、その際にPHPでMicrosoft Graph APIを利用する資料がほとんどなかったので、備忘録もかねて記事を書こうと思います。
今回は事前準備編です。

今回の設定要件

  • ユーザーのカレンダー情報をLaravelプロジェクトのDBに保存し同期を行う
  • 保存用のDBは設定済み
  • 専用のCRUDページ1は作成済み
  • Graph APIへのアクセス許可レベルはアプリケーション委任レベルとする
  • LaravelのGraph API用クラスライブラリはKiota(microsoft-graph Packegeに同梱)を利用する

手順

Azure (Microsoft Entra)にアプリを登録する

Microsoft Graphに対してPower Platformサービス以外のプログラムからリクエストを送信するためには、Microsoft Entraに認証と仲介を行うためのアプリを登録する必要があります。
Microsoft Entraにアプリを登録する方法はいくつかありますが、今回はMicrosoftが推奨する「Microsoft Entra 管理センター」から登録することにします。

Azure Portal】及び、【Microsoft Entra 管理センター】には組織内のユーザーであればだれでもログイン可能となっています。ですが、今回は要件として「アプリケーション委任」が指定されていますので、管理権限を持ったユーザーでログインしてアプリの登録を行います。

権限を持ったユーザーとしてログインすることが出来ない場合は、アプリの登録と基本設定だけを行い、後に管理権限を持つユーザーに承認を行ってもらうことも可能です。

Microsoft Entra 管理センターにアクセスするとホーム画面が開きます。
左メニューペイン⇒アプリケーションタブ⇒アプリの登録と進むと↓の画面に遷移します。

メインコンテンツ内の「新規作成」をクリックしてアプリの新規登録を行います。

設定項目設定値
名前任意の名称
サポートされているアカウントの種類利用ケースに応じて選択
リダイレクトURI空白

入力、選択後は最下部にある登録ボタンを押して登録を確定します。

各固有値の確認

登録が完了するとアプリの概要画面が表示されます。
概要画面にはGraph APIに必要なClientIDなどが表示されていますので、表示位置の確認をしておきます。

アプリの概要
表示名利用箇所等変更可否
アプリケーション(クライアント)ID証・API
オブジェクトIDPowerShell
ディレクトリ(テナント)ID認証・API
サポートされているアカウント認証・API
クライアントの資格情報認証・API
リダイレクトURI認証
アプリケーションIDのURI厳密なアクセス制御等
ローカルディレクトリでのマネージドアプリケーション厳密なアクセス制御等
概要の詳細情報

特に記載はありませんが、PowerShellではすべての参照と管理が可能です。

アクセス許可を設定する

Microsoft Graph APIに対するアクセススコープの設定を行います。

アプリケーション委任でGraph APIに対して不必要なスコープを許可すると、機密データへのアクセスの危険にさらされる恐れがあるため、必要最低限の権限のみ与えるように留意する必要があります。

「管理」カテゴリの「APIのアクセス許可」に移動して設定済みのアクセススコープを確認します。
デフォルトでは[User.Read]がユーザー権限で委任済みとなっています。ここでユーザー権限であるというのは、管理者の同意が不要であるという事です。ただし、この同意が不要なユーザーは組織に所属するユーザーに限定されるということに注意してください。管理者の承諾無しに組織外のユーザーが組織内の情報を閲覧・更新することは出来ません。
アプリケーションの許可を付与することで、アプリケーションがユーザーの代わりにGraph APIにアクセスを行いますので、外部のユーザーにもアクセス許可が適用されます。
また、認証プロセスにおいてもアプリケーションの許可であれば、リダイレクトURIが不要なため、この後に説明する「認証プロバイダの生成」時にコーディング工数を省くことが出来ます。

デフォルトのアクセス許可

では、アプリケーション委任でのアクセス許可を追加します。
今回はカレンダー情報の同期を行いたいので、[User.Read.All]と[Calendars.ReadWrite]をアプリケーションに対して許可します。
「アクセス許可の追加」をクリックし「API アクセス許可の要求」を開きMicrosoft Graphを選択します。

「アプリケーションの許可」を選択します。

検索ボックスに”Calendars”を入力し、下に表示された選択肢から[Calendars]を展開し[Calendars.ReadWrite]にチェックを入れます。
検索ボックス内のテキストをクリアし、”User”⇒[User]⇒[User.Read.All]も同様にチェックします。

アクセス許可の追加要求

最下部の「アクセス許可の追加」をクリックするとチェックした項目が追加されます。

アクセス許可の追加

この時点ではまだアクセス許可は付与されていません。
組織に管理者の同意を与えて、アクセス許可を承諾します。

アクセス許可の付与前
アクセス許可の付与後

以上で、Microsoft Entra での受け入れ設定は一旦終了です。

ユーザー委任の[User.Read]は必要ありませんので、管理者の承認を取り消してリストから削除しても問題ありません。

Laravel プロジェクトの設定

パッケージの追加

LaravelからGraph APIをREST APIとして利用するには、Composerを介してパッケージをインストールする必要があります。
Laravel プロジェクトのルートディレクトリから以下のコマンドを実行します。

composer require microsoft/microsoft-graph

問題なくインストールされれば、[composer.json]ファイルに以下のブロックが追加されます。

{
    "require": {
        "microsoft/microsoft-graph": "^2.0.0"
    }
}

環境定数に必要情報を追加

Laravel プロジェクトにMicrosoft Entraで追加したアプリの固有情報を登録します。
[.env]ファイルに「クライアントID」「クライアント シークレット」「テナントID」を登録します。
「クライアントID」「テナントID」はアプリの概要に表示されていますので、コピー&ペーストします。
定数名は[GRAPH][ENTRA]などで始まる名称にすれば他の定数と混同することは無いと思います。

GRAPH_CLIENT_ID="YOUR_CLIENT_ID"
GRAPH_CLIENT_SECRET="YOUR_CLIENT_SECRET"
# テナントIDは通常"common"を指定する事!
ENTRA_TENANT_ID="common"

「テナントID」は通常”common”を指定して下さい。
サポートされてるアカウントが「所属する組織のみ」の場合のみ「テナントID」を指定することにより、厳密なアクセス制御が可能になります。それ以外の場合、「テナントID」を指定すると外部のユーザーがアクセスできなくなります。

現時点で、「クライアント シークレット」はまだ生成していません。
Microsoft Entra 管理センターに戻り「クライアント シークレット」の生成を行います。
赤色またはオレンジ色の枠内をクリックすることで「クライアントシークレット」の管理画面へと遷移します。

アプリ概要
クライアントシークレット管理画面

「クライアント シークレット」が選択されていることを確認し、”新しいクライアント シークレット”をクリックして「クライアント シークレット」の生成を行います。

クライアント シークレットの追加
設定名設定値
説明どこで(何が)参照(アクセス)しているかわかりやすい値にする
有効期限推奨値

最下部にある「追加」ボタンをクリックすると「クライアント シークレット」が生成されアプリに追加されます。追加された”値”が「クライアント シークレット」ですので、値の右側にあるアイコンをクリックしてクリップボードにコピーし、.envファイルの値として張り付けます。
※クライアントシークレットがコピーできるのは生成直後に限られます、ここでコピーし忘れた場合は削除後に再生成を行います。

クライアント シークレット

Graph 認証プロバイダーの作成

いよいよ準備は最終段階へと入ります。
Laravel プロジェクトからGraph APIを利用するために登録したアプリに対する認証を行う「認証プロバイダー」を作成します。作成の概要はClient Credentials Provider(公式)を参照ください。
サンプルコードで使用している変数の情報を以下の表に記載します。

変数名値(参照元)説明
$clientIdenv(GRAPH_CLIENT_ID)アプリケーションの固有識別子
$tenantIdenv(ENTRA_CLIENT_ID)組織テナントの固有識別子(common)
$clientSecretenv(GRAPH_CLIENT_SECRET)クライアント シークレット

サンプルコード

use Microsoft\Kiota\Authentication\Oauth\ClientCredentialContext;

$clientId = 'YOUR_CLIENT_ID';
$tenantId = 'YOUR_TENANT_ID';
$clientSecret = 'YOUR_CLIENT_SECRET';

$tokenContext = new ClientCredentialContext(
    $tenantId,
    $clientId,
    $clientSecret);

[$tokenContext]が実際に認証を行う「認証プロバイダー」です、この「認証プロバイダー」を生成するためには、[ClientCredentialContext]クラスのインスタンスで[use]句を使ってクラスを参照する必要があります。
※クラスの”nameSpace”を見るとわかりますが、OAuth2を利用した認証を行うクラスで、内部にアクセストークンを保持します。

Graph Service Client の生成

直前に生成した認証プロバイダーを利用して、クライアントを生成します。
クライアントは[GraphServiceClient]クラスで認証プロバイダーとスコープを引数に生成されます。

use Microsoft\Graph\GraphServiceClient;

$scopes = ['https://graph.microsoft.com/.default'];

$client = new GraphServiceClient($tokenContext, $scopes);

以上で事前の準備は完了です。
Graph API の利用は生成した[$client]に対してクエリを発行するだけです。
利用するクエリは許可を得たアクセススコープに限定されることに注意してください。

編集後記

今回はクライアント シークレットを利用したアプリケーション委任での認証を行い、Graph APIを利用する方法(準備)について手順を解説しました。
LaravelではOAuthを利用したユーザー認証を実現できるパッケージ「Laravel Socialite」も用意されています。
「Laravel Socialite」を利用することによりGraph APIに対する認証プロバイダーも生成することが出来ます、こちらの方法については機会があれば紹介させていただくこととします。

  1. CRUDページとは、[Create][Read][Update][Delete]の頭文字を並べたデータベースの行データを操作する一連の処理を可能にするページ群のことを指します。通常はデータの一覧リストと併用して利用されます。 ↩︎
  2. 複数のWebサービスを連携して動作させるために使われる仕組みです。 ↩︎

この記事を書いた人

岩本敏彦
タイトルとURLをコピーしました