Microsoft Graph を使ってみよう : Azure AD における認証概要

# Microsoft Graph の認証

OAuth 2.0 (認可) と、必要に応じで OpenID Connect (認証) の組み合わせが利用できます。Azure Active Directory (Azure AD) にアプリケーションを登録して使います。

**OAuth 2.0**
Microsoft Graph に対してどのような操作が行えるかという認可をアクセストークンを用いて行います。この場合、アプリケーションはユーザーがどのように認証されたかという情報を持ちません。

**OpenID Connect**
OpenID Connect は OAuth 2.0 を拡張するもので、認証情報を含む ID トークンを Azure AD から取得できます。アプリケーションでユーザーの認証情報や認証をどこでどのように行ったかという情報が必要な場合は、OpenID Connect を同時に利用します。

## Microsoft Graph のアクセス許可

Microsoft Graph では非常にきめ細かいアクセス許可セットが定義されており、[リソース].[操作].[制約] のセットで表現されます。

- User.Read: ユーザーのプロファイルの読み取り権限
- User.Read.All: ディレクトリ内全ユーザーのプロファイルの読み取り権限
- Calendars.ReadWrite: カレンダーへの読み取りを書き込み
- Calendars.ReadWrite.Shared: ユーザーのカレンダーと共有のカレンダーの読み取りと書き込み
- Mail.Send: メールの送信権限

**制約**
制約は以下の種類があります。また今後も必要に応じて追加されていきます。

- All: ディレクトリ内にある指定した種類のすべてのリソース
- Shared: サインインしているユーザーと共有されたリソース
- AppFolder: OneDrive の専用フォルダー内でファイルを読み取りおよび書き込みするためのアクセス許可をアプリに付与
- なし: サインインしたユーザーが所有するリソースに限定

###アクセス許可の種類

**委任されたアクセス**
アプリケーションに対してユーザーが明示的に権限委任を実行。ユーザーの代わりにアプリケーションが Microsoft Graph を操作する。

**アプリケーションのアクセス許可**
サービスのようにユーザーなしで実行するアプリケーションで利用。管理者の事前同意が必要。

アクセス許可の詳細は [Microsoft Graph のアクセス許可のリファレンス](https://developer.microsoft.com/ja-jp/graph/docs/concepts/permissions_reference) を参照。

## Microsoft Graph を使うアプリケーションの種類

Microsoft Graph は様々な種類のアプリケーションで利用できます。

- モバイル/ネイティブアプリケーション
- Web アプリケーション
- SPA (シングルページアプリ)
- バックグランドサービス/デーモン
- Web API
- Function Apps や Flow など PaaS/SaaS 

それぞれのアプリケーションによってコードが実行される場所と仕組みが異なります。このブログではネイティブアプリケーションと Web アプリケーションを見ていきます。
詳細は [Microsoft Graph を呼び出せるアプリの種類について](https://developer.microsoft.com/ja-jp/graph/docs/concepts/auth_overview#what-kind-of-apps-can-i-call-microsoft-graph-from) 参照。

# Azure AD v1 と v2

Azure AD は認証エンドポイントとして v1 と v2 を提供しています。

**相違点**
- v1 は組織アカウントと ADFS 認証をサポート
- v2 は組織アカウントと Microsoft アカウント、および Azure AD B2C をサポート
- v2 は 1 つのアプリケーション ID を複数プラットフォームで利用可能
- v2 は動的なアクセス権登録と増分同意をサポート

この中でも重要なのは最後の動的および増分同意です。

**動的なアクセス権設定**
v1 ではアプリケーションの登録時に、必要なリソースとアクセス権を指定する必要がありましたが、v2 ではアプリケーションの登録後に、動的にアクセス権を変えることが出来ます。

**増分同意**
アプリケーションで多くのアクセス許可が必要な場合、v2 では必要に応じて必要な同意だけをユーザーに聞くことが出来ます。v1 では全てのアクセス権を一度に聞く方法しかなく、アクセス権が多いとリストが長くなりすぎる問題がありました。

[Choosing between ADAL.NET (Azure AD V1) and MSAL.NET (Azure AD V2) より抜粋](https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Register-your-application-with-Azure-Active-Directory#choosing-between-adalnet-azure-ad-v1-and-msalnet-azure-ad-v2)
<img src="https://user-images.githubusercontent.com/13203188/37057063-1076865a-217e-11e8-862b-e2211642175d.png" >

**<font color="red">v2 の制限</font >**
v2 は v1 で利用できる一部機能がまだサポートされていない場合があります。以下 [Adal to Msal](https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Adal-to-Msal) より抜粋。

トークンの取得 | ADAL.NET | MSAL.NET
----- | ----- | -----
ユーザー操作 | [ADAL.NET でユーザー操作認証](https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/Acquiring-tokens-interactively---Public-client-application-flows) | [MSAL.NET でユーザー操作認証](https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Acquiring-tokens-interactively)
Windows 統合認証 | [AcquireTokenSilentAsync を使った統合認証(https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/AcquireTokenSilentAsync-using-Integrated-authentication-on-Windows-(Kerberos)) | 計画はあるが、MSAL.NET では未サポート
ユーザー名/パスワード | [ユーザー名とパスワードでトークン取得](https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/Acquiring-tokens-with-username-and-password)|  計画はあるが、MSAL.NET では未サポート
デバイスコードフロー | [デバイスプロファイルを使ったブラウザが無いデバイスの認証](https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/Device-profile-for-devices-without-web-browsers) | Azure AD v2 エンドポイントで未サポート

v1 と v2 の比較詳細は [Azure AD エンドポイントか Azure AD v2.0 エンドポイントかを決定する](https://developer.microsoft.com/ja-jp/graph/docs/concepts/auth_overview#deciding-between-the-azure-ad-and-azure-ad-v20-endpoints) および [v1 と v2 の比較](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/active-directory-v2-compare) 参照。

尚、Azure Active Directory 全般については、[Azure Active Directory とは ※日本マイクロソフトのエバンジェリストである松崎さんによるブログ](https://tsmatz.wordpress.com/2012/09/01/azure-active-directory/)が非常に分かりやすいのでお勧めです。

# ADAL と MSAL
Azure AD v1/v2 エンドポイント共に、トークンの取得と管理をしてくれるライブラリがあります。それぞれ複数の言語をサポートしています。

- v1: Active Directory Authentication Library (ADAL)
- v2: Microsoft Authentication Library (MSAL)

他にも利用可能なライブラリは複数存在します。詳細は [利用可能な認証ライブラリについて](https://developer.microsoft.com/ja-jp/graph/docs/concepts/auth_overview#are-there-authentication-libraries-available) を参照。

# まとめ

今回紹介した内容は Microsoft Graph に限定したものではなく、Azure AD 認証を使う全てのアプリケーションで有効です。詳細は次回以降のブログで紹介します。

[目次へ戻る](https://qiita.com/kenakamu/items/6a1ca508dc093779eefa)

# 参照
[Microsoft Graph を呼び出せるアプリの種類について](https://developer.microsoft.com/ja-jp/graph/docs/concepts/auth_overview#what-kind-of-apps-can-i-call-microsoft-graph-from)
[Microsoft Graph のアクセス許可のリファレンス](https://developer.microsoft.com/ja-jp/graph/docs/concepts/permissions_reference)
[利用可能な認証ライブラリについて](https://developer.microsoft.com/ja-jp/graph/docs/concepts/auth_overview#are-there-authentication-libraries-available)
[Azure AD エンドポイントか Azure AD v2.0 エンドポイントかを決定する](https://developer.microsoft.com/ja-jp/graph/docs/concepts/auth_overview#deciding-between-the-azure-ad-and-azure-ad-v20-endpoints)
[v1 と v2 の比較](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/active-directory-v2-compare) 
[Azure Active Directory とは ※日本マイクロソフトのエバンジェリストである松崎さんによるブログ](https://tsmatz.wordpress.com/2012/09/01/azure-active-directory/)