紹介
シングルサインオン(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の認証フロー
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