🔑

LaravelとEntra IDを連携してSSOログインする方法【OIDC】

に公開

LaravelとMicrosoft Entra IDの連携方法

この記事では、LaravelアプリケーションとMicrosoft Entra IDを連携させる方法について、認証プロトコルの違いも含めて詳しく解説します。

目次

  1. SAMLとOIDCの違い
  2. Microsoft Entra IDでのアプリ登録
  3. LaravelでのOIDC連携実装
  4. まとめ

✅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認証フローは以下のようになります:

  1. ユーザーがLaravelアプリケーションにアクセス
  2. Laravelアプリがユーザーを認証プロバイダー(Entra ID)にリダイレクト
  3. ユーザーがEntra IDで認証
  4. Entra IDがSAMLアサーションをLaravelアプリに送信
  5. Laravelアプリがアサーションを検証し、ユーザーセッションを作成

OpenID Connect (OIDC)

OIDCはOAuth 2.0をベースにした、よりモダンな認証プロトコルです。

特徴:

  • JSONベースでRESTful APIとの親和性が高い
  • OAuth 2.0をベースにした認証レイヤー
  • 実装が比較的シンプル
  • トークンベースの認証で、JWTを使用

アーキテクチャ:

OIDCの認証フローは以下のようになります:

  1. ユーザーがLaravelアプリケーションにアクセス
  2. LaravelアプリがユーザーをOIDCプロバイダー(Entra ID)にリダイレクト
  3. ユーザーがEntra IDで認証
  4. Entra IDが認可コードをLaravelアプリに返す
  5. Laravelアプリが認可コードを使ってIDトークンとアクセストークンを取得
  6. 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アプリの登録手順

  1. Microsoft Entra管理センターにアクセス
  2. 「アプリの登録」セクションへ移動
  3. 「新規登録」をクリック
  4. アプリケーション名を入力
  5. サポートするアカウントの種類を選択
  6. リダイレクトURIを設定(例:https://your-app.com/auth/callback
  7. 「登録」をクリック

✅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