Azure WebAppにはappservice認証機能があり、AzureAD、Google、Facebook、Twitterでの認証を簡単に設定することが可能です。
非常に簡単に認証設定することができるのですが、現在は認証機能だけのため、これだけでは対象のプロバイダーで認証されたユーザ全員がWebAppにアクセスできるようになります(AzureADの場合はADの権限設定で多少制限することも可能)。
認可の機能は何かしらアプリケーション側で実装する必要があるため、今回はAzureADで認証したユーザ情報をPHPで取得する方法を調査しました。
取得すべき情報
Azure App Service および Azure Functions での認証と承認 を見ると PHP アプリの場合、App Service は _SERVER['REMOTE_USER'] 変数を設定します
という記載があったのですが、試したところこの変数では情報を取得することができませんでした。
Azure App Service 上での認証と承認の高度な使用方法 を見ると、ユーザー要求へのアクセス App Service では、特殊なヘッダーを使用して、アプリケーションにユーザー要求を渡します
という記載があり、こちらの情報で取得することができました。
サンプルコード
次のコードでヘッダ情報を取得することができました。トークンは長いのでマスク風の処理をして出力しているのと、取得できなかった情報も参考として残しています。
<?php
$headers = getallheaders();
echo "\$headers['X-MS-CLIENT-PRINCIPAL-NAME'] : ", $headers['X-MS-CLIENT-PRINCIPAL-NAME'], '<br>';
echo "\$headers['X-MS-CLIENT-PRINCIPAL-ID'] : ", $headers['X-MS-CLIENT-PRINCIPAL-ID'], '<br>';
echo "\$headers['X-MS-CLIENT-PRINCIPAL-IDP'] : ", $headers['X-MS-CLIENT-PRINCIPAL-IDP'], '<br>';
echo "\$headers['X-MS-TOKEN-AAD-ID-TOKEN'] : ", substr($headers['X-MS-TOKEN-AAD-ID-TOKEN'], 0, 10), '******************** <br>';
echo "\$headers['X-MS-TOKEN-AAD-ACCESS-TOKEN'] : ", substr($headers['X-MS-TOKEN-AAD-ACCESS-TOKEN'], 0, 10), '******************** <br>';
echo "\$headers['X-MS-TOKEN-AAD-REFRESH-TOKEN'] : ", substr($headers['X-MS-TOKEN-AAD-REFRESH-TOKEN'], 0, 10), '******************** <br>';
echo "\$headers['X-MS-TOKEN-AAD-EXPIRES-ON'] : ", $headers['X-MS-TOKEN-AAD-EXPIRES-ON'], '<br>';
echo "\$_SERVER['REMOTE_USER'] : ", $_SERVER['REMOTE_USER'], '<br>'; // 取得できない
echo "\$_SERVER['PHP_AUTH_USER'] : ", $_SERVER['PHP_AUTH_USER'], '<br>'; // 取得できない
$current_user = get_current_user();
echo "\$current_user : ", $current_user, '<br>'; // nobody になる
?>
これをWebAppで実行すると出力結果は次のようになりました。
X-MS-CLIENT-PRINCIPAL-IDP
でAzureAD(aad)が、X-MS-CLIENT-PRINCIPAL-NAME
でユーザ名が取得できました。この環境ではgmailのMSアカウントをAzureADにゲスト登録しているため @gmail.comのユーザ名となっています。
その他のプロバイダの場合
その他のプロバイダで認証した場合も、同様にヘッダ情報からユーザ情報が取得できるかと思います。ドキュメントにあるヘッダ情報を並べただけですが、同様に情報取得するサンプルを こちら に作成してみました。