Help us understand the problem. What is going on with this article?

[Azure] WebAppでAzure AD認証を有効にした際に、実際に認証したユーザ情報をアプリ側で取得する(PHP編)

Azure WebAppにはappservice認証機能があり、AzureAD、Google、Facebook、Twitterでの認証を簡単に設定することが可能です。

image.png

非常に簡単に認証設定することができるのですが、現在は認証機能だけのため、これだけでは対象のプロバイダーで認証されたユーザ全員がWebAppにアクセスできるようになります(AzureADの場合はADの権限設定で多少制限することも可能)。

認可の機能は何かしらアプリケーション側で実装する必要があるため、今回はAzureADで認証したユーザ情報をPHPで取得する方法を調査しました。

取得すべき情報

Azure App Service および Azure Functions での認証と承認 を見ると PHP アプリの場合、App Service は _SERVER['REMOTE_USER'] 変数を設定します という記載があったのですが、試したところこの変数では情報を取得することができませんでした。

Azure App Service 上での認証と承認の高度な使用方法 を見ると、ユーザー要求へのアクセス App Service では、特殊なヘッダーを使用して、アプリケーションにユーザー要求を渡します という記載があり、こちらの情報で取得することができました。

サンプルコード

次のコードでヘッダ情報を取得することができました。トークンは長いのでマスク風の処理をして出力しているのと、取得できなかった情報も参考として残しています。

get_aad_info.php
<?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で実行すると出力結果は次のようになりました。
image.png

X-MS-CLIENT-PRINCIPAL-IDP でAzureAD(aad)が、X-MS-CLIENT-PRINCIPAL-NAMEでユーザ名が取得できました。この環境ではgmailのMSアカウントをAzureADにゲスト登録しているため @gmail.comのユーザ名となっています。

その他のプロバイダの場合

その他のプロバイダで認証した場合も、同様にヘッダ情報からユーザ情報が取得できるかと思います。ドキュメントにあるヘッダ情報を並べただけですが、同様に情報取得するサンプルを こちら に作成してみました。

参考資料

VA_nakatsu
Azure, AWSを中心に検証結果を整理しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away