Laravel 5.8からMicrosoft Graph APIを利用する (公式ドキュメント編)


LaravelアプリでOffice 365アカウントによるOAuth認証を実装するにあたって、公式ドキュメント PHP アプリで Outlook REST API を使用する方法 – Outlook Developer | Microsoft Docs の手順を確認してみたメモになります。

このブログの以前の記事「Office 365 REST APIを利用したRuby on Railsアプリの作成」でRuby on Rails版の確認をしていますが、そのPHP版になります。

公式ドキュメントでは、チュートリアル形式でAuthorization Code Flowの処理を一つ一つ実装し、詳細に解説していますが、実際には、これらの手順はLaravel Socialiteを利用すると簡単に実装できます。
そこで、この記事では、Azure ADにアプリケーションを登録し、チュートリアル サンプルを手元で動かし、手っ取り早くAzure ADに登録されたアカウントのアクセストークンをLaravelアプリから取得する流れを体感することができるようにまとめてみました。

Azure Active Directory 管理センター

Rails版の記事を書いていたのは2016年でしたが、その後新しいAzure ADの管理ポータル Azure Active Directory 管理センターがリリースされていました。

The new Azure AD Admin Console is GA!

2017年なのですでにだいぶ前ですね。

Azure Active Directory 管理センターには、直接 https://aad.portal.azure.com/ を開くか、Office 365の管理センターでAzure Active Directoryを選択して開くことができます。


Laravelプロジェクトの準備

チュートリアル プロジェクトをクローンします。

$ git clone git@github.com:jasonjoh/php-tutorial.git
$ cd php-tutorial

サンプルプロジェクトのLaravelのバージョンは5.4になっています。
composer.jsonのパッケージを以下のように新しいバージョンに書き換えておきます。
また、scriptspost-update-cmdが5.8では削除されているのでこちらも修正しておきます。

{
    ...
    "require": {
        "php": "^7.1.3",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "5.8.*",
        "laravel/tinker": "^1.0",
        "league/oauth2-client": "^2.4",
        "microsoft/microsoft-graph": "^1.0"
    },
    "require-dev": {
        "beyondcode/laravel-dump-server": "^1.0",
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^3.0",
        "phpunit/phpunit": "^7.5"
    },
    ...
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ]
    },
    ...
}

composer install.envファイルの作成、キーの生成を実行します。

$ composer install
$ cp .env.example .env
$ php artisan key:generate

Azure Active Directory 管理センターでアプリを登録する

チュートリアルのアプリを登録するの手順に沿ってAzure ADにアプリを登録します。

Azure Active Directory 管理センターを開きます。

  1. 左側のナビゲーションから[Azure Active Directory]を選択し、[アプリの登録]を選択します。
    続いて[新規登録]をクリックします。

  1. チュートリアルの説明の通りフォームを入力して[登録]をクリックします。

[サポートされているアカウントの種類]は3つのオプションがありますが、各オプションについて補足説明しておきます。

  • [この組織のディレクトリ内のアカウントのみ (<ドメイン名>)]は、現在表示しているドメインに属するアカウントのみがアプリケーションを利用可能になります。
  • [任意の組織のディレクトリ内のアカウント]は、ビジネスアカウントであればどの組織のアカウントでもアプリケーションを利用可能になります。
  • [任意の組織のディレクトリ内のアカウント、個人用のMicrosoftアカウント (Skype、Xbox、Outlook.com など)]は、上記に加えて個人のMicrosoftアカウントでもアプリケーションを利用可能になります。
  1. 作成されたアプリのページが開きます。
    [アプリケーション (クライアント) ID]は、後で.envに設定します。

  1. [認証]を開き[暗黙の付与]の[ID トークン]にチェックをいれて保存します。

「暗黙の付与」は、英語表示すると「Implicit Grant」です。説明に書いてあるとおりサーバーサイドがないSPAやモバイルアプリなど用に、implicit grant flowを有効化するチェックボックスです。
今回のLaravelのアプリで利用するフローは、Authorization Code Flowなのでこのチェックは実は不要です。

  1. [証明書とシークレット]を選択して、[新しいクライアント シークレット]をクリックします。

  1. [クライアントシークレットの追加]で、[説明]を適当に入力し、[有効期限]もいづれかを選択して[追加]をクリックします。

  1. クライアントシークレットが作成サれました。[値]は、後で.envに設定します。

.envにアプリを設定

OAUTH_APP_ID=YOUR_APP_ID_HERE
OAUTH_APP_PASSWORD=YOUR_APP_PASSWORD_HERE
OAUTH_REDIRECT_URI=http://localhost:8000/authorize
OAUTH_SCOPES='openid profile offline_access User.Read Mail.Read'
OAUTH_AUTHORITY=https://login.microsoftonline.com/common
OAUTH_AUTHORIZE_ENDPOINT=/oauth2/v2.0/authorize
OAUTH_TOKEN_ENDPOINT=/oauth2/v2.0/token

以下を設定し保存します。

  • YOUR_APP_ID_HEREに「アプリケーション (クライアント) ID」
  • YOUR_APP_PASSWORD_HEREに「クライアント シークレット」

OAUTH_SCOPESでは、取得するアクセストークンで要求するスコープを指定しています。
各スコープについては、「Microsoft Graph のアクセス許可のリファレンス – Microsoft Graph | Microsoft Docs」で確認することができます。

動作確認

httpサーバーを起動します。

$ php artisan serve

以下、Outlookが利用可能なライセンス(Office 365、Exchange Onlineのいづれか)を付与されたアカウントでサインインします。

ブラウザで、http://localhost:8000を開き、[Connect to Outlook]をクリックします。

Microsoft アカウントにサインイン画面にリダイレクトされます。
メールアドレスを入力して[次へ]、パスワードを入力してサインインします。

オフラインアクセス、プロファイル情報、Outlookのメール、カレンダー、連絡帳への参照アクセス権限を求められます。
[承諾]をクリックします。

アクセス トークンを取得すると、Laravelアプリのメール一覧にリダイレクトされます。
テスト用のアカウントなので1件しかメールが表示されていませんが、Microsoft Graph APIからデータを取得して表示するところまで確認できました。

, , ,