Microsoft Entra(旧Azure AD)でOAuthのSSOの実現方法

王文暁

紹介

シングルサインオン(SSO)の紹介

シングルサインオンとは、1度のユーザー認証によって業務アプリケーションやクラウドサービスといった、複数のシステムの利用が可能になる仕組みを指します。

Microsoft Entra 紹介

マルチクラウド ID およびネットワーク アクセスの一連のソリューションがあり、ID とリソースへのアクセスもセキュリティを保護できることです。このサイトはユーザー情報の一連の機能が提供しています。

元々はAzureの機能の一つでした。名前はAzure Active Directoryでした。今Azure Active Directory は Microsoft Entra ID になりました。自分のドメインがあります。

公式サイト: https://entra.microsoft.com

Microsoft Graph 紹介

Microsoft Graph は、Microsoft クラウド サービスのデータにアクセスするための REST API とクライアント ライブラリを公開しています。

公式サイト:https://developer.microsoft.com/graph

Microsoft Entraと連携の流れ

SSOの実現プロトコルについてMicrosoft EntraはOAuth 2.0、OIDC、SAMLなどを提供されています、SDKともっと基礎的なHTTP API二つ方法提供されています。

原理など理解しやすいために、良く使うOAuth 2.0とHTTP APIを選択して紹介します。

Microsoft Entraの管理画面の操作

テナントを作成します

テナント中にあるユーザーがSSOでログインできます。テナントIDは後ろのソースコードには必要です。

ユーザー管理のアプリを登録します

clientIDは後ろには必要です。

アプリ認証

ログイン処理のソースコードのURLを書き込ます。

パブリック クライアント フローを許可するで [はい] を選択します。

シークレットを作成

シークレットを作成します。

API許可

必要なMicrosoft GraphのAPIのアクセス許可を追加します。

ソースコード紹介

OAuth 2.0の認証フロー

参照元:https://learn.microsoft.com/ja-jp/entra/identity-platform/v2-oauth2-auth-code-flow

getAtoken.phpのソースコード全文

<?php
use GuzzleHttp\Client;
require_once realpath(__DIR__ . '/vendor/autoload.php');

$code = $_GET['code'];
if ($code) {
    try {
        $tokenClient = new Client();
        $tokenResponse = $tokenClient->post( 'https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token', array(
            'form_params' => array(
                'client_id'    => 'd50abf2b-a1d5-4209-9dc3-5b310c3a55c0',
                'code'         => $code,
                'grant_type'   => 'authorization_code',
                'redirect_uri' => 'http://localhost:5000/getAToken.php',
                'client_secret'        => 'xxxxxxxxx',
            ),
        ) );

        $responseBody = json_decode( $tokenResponse->getBody()->getContents() );
        if ( isset( $responseBody->access_token ) ) {
            $client = new Client();
            $response = $client->request('GET', 'https://graph.microsoft.com/v1.0/me', [
                'headers' => [
                    'Authorization' => $responseBody->token_type . ' ' .  $responseBody->access_token
                ]
            ]);
            $body = $response->getBody()->getContents();
            var_dump($body);exit;
        }
    }catch (GuzzleHttp\Exception\ClientException $e) {
            $statusCode = $e->getResponse()->getStatusCode();
            $responseBody = $e->getResponse()->getBody()->getContents();
            echo "Error: $statusCode\n$responseBody\n";
            return;
    }

}else{
    var_dump('$code is empty');
}

ローカルでURLがlocalhost:5000のウェブサイト作成して、上のソースコードをgetAtoken.phpに書き込みます。

コアロジックには3つのステップがあります

codeを取得
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=d50abf2b-a1d5-4209-9dc3-5b310c3a55c0
&response_type=code
&response_mode=query
&scope=user.read%20mail.read

{tenant}: tenantIDに変更します。
client_id: 登録したclient_idに変更します。
scope: ユーザーに同意してもらいたいMicrosoft Graphの権限をスペースで区切ったリストです。

ログインしたいユーザーには、うえのリンクをクリックするよう指示します。

以下のスクリーンショットは、Microsoftアカウントユーザーに同意されるダイアログボックスの例です。

access_tokenを取得

access_tokenがあったら、Microsoft GraphのAPIを使用することができます。

下のソースコードはgetAtoken.phpの上部です、access_tokenを取得するため、ステープ1取得したcodeを持ってhttps://login.microsoftonline.com/{tenant}/oauth2/v2.0/tokenにアクセスします。

        $tokenResponse = $tokenClient->post( 'https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token', array(
            'form_params' => array(
                'client_id'    => 'd50abf2b-a1d5-4209-9dc3-5b310c3a55c0',
                'code'         => $code,
                'grant_type'   => 'authorization_code',
                'redirect_uri' => 'http://localhost:5000/getAToken.php',
                'client_secret'        => 'xxxxxxxxx',
            ),
        ) );
     $responseBody = json_decode( $tokenResponse->getBody()->getContents() );

{tenant}: tenantIDに変更します。
client_id: 登録したclient_idに変更します。
redirect_uri: getAtoken.phpのURL。
client_secret: Microsoft Entraの管理画面で設定されたシークレットです。

ユーザー関連の情報を取得

getAtoken.phpの後半部分のロジックは、access_tokenを持ってgraph.microsoft.com/v1.0/meにアクセスして、ユーザーのemail、nameなど情報取得できます。

レファレンス

Microsoft ID プラットフォームと OAuth 2.0 認証コード フロー – Microsoft identity platform | Microsoft Learn

Authentication and authorization basics – Microsoft Graph | Microsoft Learn

Microsoft Graph を使って PHP アプリを構築する – Microsoft Graph | Microsoft Learn

<< 103 Early HintsをKUSANAGI+CloudFlareで利用してみるコンテナイメージをAWS Lambda関数にデプロイしてみました >>

関連記事

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解