LaravelとEntra IDを連携してSSOログインする方法【OIDC】
LaravelとMicrosoft Entra IDの連携方法
この記事では、LaravelアプリケーションとMicrosoft Entra IDを連携させる方法について、認証プロトコルの違いも含めて詳しく解説します。
目次
✅SAMLとOIDCの違い
LaravelとMicrosoft Entra IDを連携する際には、主に「SAML 2.0」と「OpenID Connect (OIDC)」という2つの認証プロトコルを使用することができます。
SAML 2.0 (Security Assertion Markup Language)
SAMLは主に大企業向けのSSOで広く使われているXMLベースのプロトコルです。
特徴:
- XMLベースで情報交換を行う
- エンタープライズ環境での使用に最適化されている
- 主にWebアプリケーションでの認証に使用される
- 実装が比較的複雑
実際のSAML認証フローは以下のようになります:
- ユーザーがLaravelアプリケーションにアクセス
- Laravelアプリがユーザーを認証プロバイダー(Entra ID)にリダイレクト
- ユーザーがEntra IDで認証
- Entra IDがSAMLアサーションをLaravelアプリに送信
- Laravelアプリがアサーションを検証し、ユーザーセッションを作成
OpenID Connect (OIDC)
OIDCはOAuth 2.0をベースにした、よりモダンな認証プロトコルです。
特徴:
- JSONベースでRESTful APIとの親和性が高い
- OAuth 2.0をベースにした認証レイヤー
- 実装が比較的シンプル
- トークンベースの認証で、JWTを使用
アーキテクチャ:
OIDCの認証フローは以下のようになります:
- ユーザーがLaravelアプリケーションにアクセス
- LaravelアプリがユーザーをOIDCプロバイダー(Entra ID)にリダイレクト
- ユーザーがEntra IDで認証
- Entra IDが認可コードをLaravelアプリに返す
- Laravelアプリが認可コードを使ってIDトークンとアクセストークンを取得
- Laravelアプリがトークンを検証し、ユーザーセッションを作成
※OIDCの流れについてはこの記事が一番わかりやすい
SAML vs OIDC:どちらを選ぶべきか
特性 | SAML 2.0 | OpenID Connect |
---|---|---|
データ形式 | XML | JSON |
複雑さ | より複雑 | より簡素 |
使用場面 | 主にエンタープライズWebアプリ | Web・モバイル・SPA |
モバイル対応 | 限定的 | 優れている |
APIアクセス | 対応していない | ネイティブ対応 |
セキュリティ | 高い(成熟している) | 高い(モダンな仕様) |
選択の目安:
- エンタープライズ環境で既存のSAMLインフラがある場合はSAML
- モバイルアプリやSPA、APIとの連携が必要な場合はOIDC
- 新規プロジェクトではOIDCが推奨される傾向がある
...ということで今回はOIDCを採用
✅Microsoft Entra IDでのアプリ登録
まず、Microsoft Entra IDポータルでアプリケーションを登録する必要があります。
OIDCアプリの登録手順
- Microsoft Entra管理センターにアクセス
- 「アプリの登録」セクションへ移動
- 「新規登録」をクリック
- アプリケーション名を入力
- サポートするアカウントの種類を選択
- リダイレクトURIを設定(例:
https://your-app.com/auth/callback
) - 「登録」をクリック
✅LaravelでのOIDC連携実装
OIDCを使用してLaravelとEntra IDを連携する手順を説明します。
1. 必要なパッケージのインストール
composer require socialite
または、Microsoft Azureを使用する場合:
composer require laravel/socialite
composer require socialiteproviders/microsoft-azure
2. 設定ファイルの準備
config/services.php
に以下を追加:
'azure' => [
'client_id' => env('AZURE_CLIENT_ID'),
'client_secret' => env('AZURE_CLIENT_SECRET'),
'redirect' => env('AZURE_REDIRECT_URI'),
'tenant' => env('AZURE_TENANT_ID'),
'proxy' => env('PROXY') // 任意
],
.env
ファイルに必要な環境変数を追加:
MICROSOFT_CLIENT_ID=your-client-id
MICROSOFT_CLIENT_SECRET=your-client-secret
MICROSOFT_REDIRECT_URI=https://your-app.com/auth/microsoft/callback
MICROSOFT_TENANT_ID=your-tenant-id
3. ServiceProviderの設定
app/Providers/EventServiceProvider.php
に以下を追加(Microsoft Azure使用時):
※laravel11以上ではデフォルトのプロバイダが削除されたので、代わりにファサードのメソッドを使用して、メソッド内でリスナーを追加
Event::listen(function (\SocialiteProviders\Manager\SocialiteWasCalled $event) {
$event->extendSocialite('azure', \SocialiteProviders\Azure\Provider::class);
});
laravel10以下
SocialiteWasCalled
イベントをリッスンするようにパッケージのリスナーを構成します。
listen[]の配列にイベントを追加します
protected $listen = [
\SocialiteProviders\Manager\SocialiteWasCalled::class => [
// ... other providers
\SocialiteProviders\Azure\AzureExtendSocialite::class.'@handle',
],
];
4. ルートの設定
routes/web.php
に以下を追加:
use Laravel\Socialite\Facades\Socialite;
Route::get('/auth/microsoft', function () {
return Socialite::driver('azure')->redirect();
})->name('microsoft.login');
Route::get('/auth/microsoft/callback', function () {
$user = Socialite::driver('azure')->user();
// ここでユーザー情報を処理
// 例:データベースに保存、ログイン処理など
return redirect('/dashboard');
})->name('microsoft.callback');
5. コントローラーの実装
より構造化された実装のためにコントローラーを作成するのがベストプラクティスです:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Laravel\Socialite\Facades\Socialite;
class MicrosoftController extends Controller
{
public function redirectToMicrosoft()
{
return Socialite::driver('azure')->redirect();
}
public function handleMicrosoftCallback()
{
$msUser = Socialite::driver('azure')->user();
// メールアドレスでユーザーを検索または作成
$user = User::updateOrCreate(
['email' => $msUser->email],
[
'name' => $msUser->name,
'microsoft_id' => $msUser->id,
'microsoft_token' => $msUser->token,
'microsoft_refresh_token' => $msUser->refreshToken,
]
);
Auth::login($user);
return redirect()->intended('/dashboard');
}
}
そして、ルートを更新:
Route::get('/auth/microsoft', [MicrosoftController::class, 'redirectToMicrosoft'])->name('microsoft.login');
Route::get('/auth/microsoft/callback', [MicrosoftController::class, 'handleMicrosoftCallback'])->name('microsoft.callback');
✅まとめ
LaravelアプリケーションとMicrosoft Entra IDの連携は、エンタープライズ環境での認証管理を大幅に改善できます。OIDCとSAMLという2つの主要な認証プロトコルのいずれかを選択することで、ビジネス要件に最適な実装が可能です。
新規プロジェクト:OIDCの使用を検討(シンプルさとモダンな仕様)
既存のSAML環境:SAML実装の活用
ハイブリッドアプローチ:状況によっては、両方のプロトコルをサポートすることも選択肢
Discussion