見出し画像

Microsoft Entra ID を用いた認証機能の実装


はじめに

はじめまして。エムシーデジタルでソフトウェアエンジニアをしている荻野です。
この記事では、Microsoft Entra ID を用いた認証機能の実装方法について整理します。

Microsoft Entra ID とは Microsoft 365 の認証基盤で、Microsoft ユーザーを用いてアプリケーションに認証を付与するために使用することができます。
企業のグループウェアとして Microsoft 365 はトップレベルのシェア率を誇ります。
そのユーザーをそのまま認証に使用でき、ユーザー情報の取得などが比較的簡単に実装できるといった理由から、Microsoft Entra ID による認証が役に立つ場面は多くあります。
それゆえ、本テーマの需要は多いと考え今回の執筆に至りました。

Entra ID とは

Microsoft Entra ID は Microsoft 365 の認証基盤です。
「Azure AD」と呼ばれることもありますが、 Azure AD は Entra ID の旧名称で同じサービスを指します。また、この経緯から aad などの名称が認証トークンの命名などに残っています。

Entra ID には以下のような機能があります。

Entra ID は Azure Cloud のクラウドサービスとして利用することができます。


類似サービスとの比較

Azure Cloud 以外の大手クラウドサービスの代表である Amazon AWS、Google Cloud にもそれぞれ AWS IAM、Google Cloud Identity と呼ばれる認証サービスがあります。

また、大手クラウドサービス以外が提供する認証サービスとして、Okta や Auth0、OneLogin といった認証サービスもあります。

それぞれの認証サービスに細かい機能の差はありますが、クラウド内のサービスを使用する場合は基本的にアプリケーションサーバーなどと同じクラウドに使用することになります。そのようにすることで連携時のシナジーを得やすくなります。

また大手クラウドサービス以外が提供する認証サービスは、それぞれより専門的な認証機能や信頼性、サポート体制を持っているため、それらも検討の対象になります。


どのようなときに Microsoft Entra ID を使用するか

上記の比較を踏まえ、以下のようなときは Microsoft Entra ID が認証サービスとして有力な候補になります。

  • Microsoft 365 をグループウェアとして使用している会社内のみで使用するアプリに認証をつけたい

  • Microsoft 365 ユーザー情報をアプリ内で利用したい

  • 認証のために外部サービスを利用せず、Azure Cloud 内で閉じたインフラ構成にしたい


実装方法

では、どのように Azure Entra ID による認証を Web アプリケーションに組み込むかを、具体的に説明します。

例として、Azure App Service で Web アプリケーションをホストする構成を想定しています。
認証の機能として、会社のテナントのユーザーが全員アクセスでき、自分の部署などの情報が表示されるようなアプリを作成します。


システムの構成

単体の Azure App Service で動く Web アプリケーションを考えます。Web アプリケーション自体はすでにデプロイ済みの状態を想定しています。

そこに Entra ID による認証を付与し、アクセス制限とユーザー情報の表示機能を追加します。


App Service に登録

Azure App Service や Azure Functions では組み込みの認証がサポートされており、App Service 側で設定をするだけでアプリに認証機能を付与することができます。

ID プロバイダーとしては、以下のようなものがサポートされています。これらから複数のプロバイダーを選択することもできます。

  • Microsoft

  • Apple

  • Facebook

  • GitHub

  • Google

  • X (Twitter)

  • OpenID Connect

Microsoft を選択すると、追加の設定項目が表示されます。

ここで既存の Entra ID アプリケーションを使用するか、新規に作成しつつ割り当てるかを選択できます。今回は新規に作成を選択し、Entra ID アプリケーションの設定をします。


Entra ID アプリケーションの作成

Entra ID アプリケーションを作成します。

サポートするアカウントの種類として以下の 3 つから選択できます。

  • この組織ディレクトリ内のアカウント(シングルテナント)

  • 任意の組織ディレクトリ内のアカウント(マルチテナント)

  • 個人用 Microsoft アカウント

「シングルテナント」だと会社の社内のユーザーのみ使用できるように構成できます。
「マルチテナント」の場合、他の会社も含めて何かの組織ディレクトリのアカウントならログインできるようになります。
また、個人用 Microsoft アカウントの場合は、組織に属さない個人アカウントでのログインができるようになります。
今回の例では「シングルテナント」を選択します。

また、Entra ID アプリケーションを新規作成する際にはリダイレクト URI も指定できます。App Service への組み込みの認証として設定する場合、 <app-url>/.auth/login/aad/callback を指定します。App Service のメニューから作成・割り当てを行う際には、こちらは自動で設定されるため必要ありません。

またここで、「アクセス許可」のタブを選択するとアプリケーションのアクセス許可をカスタマイズすることができます。
デフォルトでは User.Read が付与されています。これはサインイン・ユーザー情報確認に必要なため、消してはいけません。
後述の Azure サービスとの連携をアプリケーションで行いたい場合、ここで必要なスコープを追加します。


アプリケーションの実装

アクセス制限のみを目的とする場合、アプリケーションに特別な処理は必要ありません。
認証機能として追加でアプリケーションに処理を追加したい場合、Azure App Service の組み込みの認証が以下のような機能を提供しています。

* ヘッダーに挿入されるプロバイダー固有の OAuth トークン
* 認証用のエンドポイント

これらを利用することで、認証に関連した機能をアプリケーションに実装することができます。以下にいくつかの例を挙げます。

▼ユーザー情報の取得

App Service の組み込みの認証を使用する場合、アプリケーションへのリクエストのヘッダにプロバイダーごとの OAuth トークンが付与されます。

Entra ID の場合は以下のトークンがヘッダに付与されます。

  •  X-MS-TOKEN-AAD-ID-TOKEN

  •  X-MS-TOKEN-AAD-ACCESS-TOKEN

  •  X-MS-TOKEN-AAD-EXPIRES-ON

  •  X-MS-TOKEN-AAD-REFRESH-TOKEN

ここから、例えば X-MS-TOKEN-AAD-ID-TOKEN をデコードすることで、ユーザー名やメールアドレスをアプリケーションで表示することができます。

例として、Python で msal (MSAL: Microsoft Authentication Library) パッケージを利用して ID トークンからユーザーのメールアドレスを取得するコードは以下のようになります。

from msal.oauth2cli.oidc import decode_part

def get_email_from_id_token(id_token: str):
     id_token_payload = json.loads(decode_part(id_token.split(".")[1]))
     email = id_token_payload.get("email", None)
     return email 

▼ログイン・ログアウトの実装

App Service の組み込みの認証を使用する場合、デフォルトで以下のような認証用のエンドポイントが設定されます。

  •  /.auth/me

  •  /.auth/login/<provider>

  •  /.auth/logout

  •  /.auth/refresh

これらを利用して、例えばログアウトのボタンを以下のように作成することができます。

<a href="/.auth/logout">Sign out</a>

▼Microsoft サービスとの連携

Entra ID に適切な Graph API へのアクセス許可を設定することで、他 Microsoft サービス(Outlook、Teams など)と連携することができます。

Graph API を呼ぶ際は API エンドポイントを直接叩くこともできますし、 各言語の SDK もこのように用意されています:
https://learn.microsoft.com/ja-jp/graph/sdks/sdks-overview

例として、アクセストークンを使用して Outlook カレンダーに新規予定を追加する Python コードは以下のようになります。このコードでは msal パッケージは利用せず、標準パッケージの requests パッケージを利用しています。

import requests

def add_some_calendar_event(access_token: str):
     # Define the Graph API endpoint
     url = "https://graph.microsoft.com/v1.0/me/calendar/events"

    # Define the new event data 
    data = {
         "subject": "New Event",
         "start": {
             "dateTime": "2024-01-01T10:00:00",
             "timeZone": "UTC" 
        },
         "end": {
             "dateTime": "2024-01-01T11:00:00",
             "timeZone": "UTC"
         }
     }

    # Send a POST request to create a event
     headers = {"Authorization": "Bearer " + access_token}
     response = requests.post(url, headers=headers, json=data) 


まとめ

本記事では、Microsoft Entra ID を用いて Web アプリケーションに社内ユーザー向けの Microsoft ユーザー認証を付与する方法を説明しました。
また、Microsoft 認証を用いた機能をアプリケーションに実装する方法の例を挙げました。
App Service の組み込みの認証を使用することで、少ないコード実装量で様々な認証機能を組み込むことができます。


Microsoft Entra ID を用いた認証は Microsoft 365・Azure Cloud を利用している会社の社内アプリケーションの認証として筆頭になるので、この記事の内容を活用していただけたらと思います。


参考文献


エムシーデジタルでは、技術力向上のためのイベントや勉強会なども定期的に実施しています。 もしエムシーデジタルで働くことに興味を持っていただいた方がいらっしゃいましたら、カジュアル面談も受け付けておりますので、お気軽にお声掛けください!

採用情報や面談申込みはこちらから


この記事が気に入ったらサポートをしてみませんか?