[Azure] API Managementで、Azure Active DirectoryとOpenID Connectを使用してAPIを保護する

Azure API Managementは、バックエンドAPIの保護と管理がおこなえるAPI Gatewayサービスです。

- あらゆるバックエンドAPIに接続(Azureサービスだけではなく、他社製サービスにも対応)
- ほぼリアルタイムの使用量、パフォーマンス、正常性分析
- 認証、JWTトークン検証、クォータ制限、レート制限、IPフィルタリングなどの保護機能
- 開発者向け機能：API カタログ、ドキュメント、コード サンプルの自動生成

といった機能があります。

このうち、認証機能についてですが、Oauth 2.0については [こちらのページ](https://docs.microsoft.com/ja-jp/azure/api-management/api-management-howto-protect-backend-with-aad) に詳しい設定手順がありますが、OpenID Connectの方の設定は少し手順が異なりました。

設定を試してみたので、以下に手順をまとめておきます。

# 1) API Managementの作成

Azureポータルから、API Managementを作成します。

リソースの作成 -> API management -> 作成 で名前等を入力して作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/928078b5-174f-d034-4a82-ad55a21bc25e.png)

各入力項目は任意の値で構いませんが、<font color="red"><b>API Managementには無料プランが無く、Developerプランでも ￥7.37/時間 の料金がかかる</b></font>ので注意して下さい (2018/07/26 時点の東日本リージョンの定価)。

作成後、API Managementの概要に表示される<font color="blue"><b>ゲートウェイのURL</b></font> をコピーしておきます。この値を以降の設定で使用します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/9d7e615e-8e28-9f79-acc3-8a206e3239d9.png)

# 2) API を表すアプリケーションを Azure AD に登録する

アプリケーションを Azure AD に登録します。

Azureポータルから Azure Active Directory -> アプリの登録 -> 新しいアプリケーションの登録 を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/6e18ca91-16fa-b20b-41b3-b9df65ba4b9b.png)

名前(何でもいいです)を入力して、アプリケーションの種類は「Webアプリ/API」を選択します。
サインオンURLには <font color="blue"><b>{ゲートウェイのURL}/signin</b></font> (ゲートウェイのURLは先の手順でコピーしておいたもの)を入力して、「作成」を押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/2d6db679-d017-04cf-a772-57c87a00e5dc.png)

作成されるとプロパティが表示されるので、<font color="blue"><b>アプリケーションID</b></font> をコピーしておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/58e58274-f5d8-723a-9190-1f36bd182c44.png)

引き続き、作成されたアプリケーションのメニューから「設定」->「キー」を選択して<font color="blue"><b>パスワード</b></font>を発行します。
警告メッセージが出ているように、パスワードは発行時にコピーしないと再取得できないので注意して下さい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/c82f2ccc-951c-e68c-411d-8b4afd1a37ad.png)

最後に、Azure Active Directoryのプロパティに戻り、<font color="blue"><b>ディレクトリID</b></font> をコピーしておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/e814d0e0-096d-ef90-9c63-3947379f3bc6.png)

Azure ADの設定はこれでひとまず完了です。

# 3) API Management Developer Console で OpenID Connect 認証オプションを有効にする

1) で作成したAPI Managementに戻り、OpenID Connect -> 追加 を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/cb828bae-f27e-7731-2d69-589f70a956ff.png)

保存しておいた情報を元に、以下の通り入力します。

- メタデータエンドポイントURL: <font color="blue"><b>https://login.microsoftonline.com/{ディレクトリID}/.well-known/openid-configuration</b></font>
- クライアントID: <font color="blue"><b>アプリケーションID</b></font>
- クライアントシークレット: <font color="blue"><b>パスワード</b></font>

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/edff17e3-8956-df7a-4303-273dde0af859.png)

その他の項目は、任意の値を入力して、「作成」を押します。

作成後表示されるプロパティにて、<font color="blue"><b>リダイレクトURL２つ</b></font>をコピーしておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/24037184-e2e8-5f32-35f5-e3994b3499a1.png)

続いてAPI Managementのメニューに戻り、「API」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/0382b97c-cafb-4ee9-6b18-9af87149b367.png)

デフォルトで作成されている「Echo API」-> Settings を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/596044be-18a4-f9b7-75e5-b6d212d6dc74.png)

Security設定にて、OpenID Connectをチェックし、OpenID Connect serverのプルダウンで先ほど作成したプロバイダを選択してから「Save」を押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/c4d15f20-025f-3018-fa2b-f3519de6916b.png)

以上でAPI Managementの設定は完了です。

# 4) Azure ADアプリケーションに 応答URLを登録する

最後に、Azure ADアプリケーションに 応答URLを登録します。

Azure Active Directory -> アプリの登録 -> 2)で作成したアプリを選択 -> 設定 -> 応答URL を選択し、保存しておいた <font color="blue"><b>リダイレクトURL２つ</b></font> を入力して保存します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/9b643d9e-4f2b-e21e-4651-dfb28c64eb5e.png)

以上で設定は完了です。

# 動作確認

設定したOpenID Connectが正しく動作するか試してみます。API Managementの 概要 -> 開発者ポータル を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/4fe759bd-8da1-2cf7-91dc-2ff2eee0c48a.png)

APIS -> Echo API -> Try it を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/91516338-b7eb-0d18-9aed-af1af949190a.png)

Authorization のプルダウンから、Authorization codeを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/253771cd-212d-54ed-fa26-fb33b9777a8d.png)

アクセス許可ダイアログが表示されるので承諾します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/b797dc32-a034-93d0-5be5-7ec46d180eaa.png)

Authorizationヘッダが設定されたことを確認して「Send」を押します。
![3266642e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/172826/a10f503f-844b-2cab-dbbf-3a4da1afea7c.png)

レスポンス200が返ることが確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/791b45f1-4ece-41de-2ff0-38797e44819b.png)

以上でOpenID Connectの設定が確認できました。

# 参考資料

- [Azure Active Directory と API Management で OAuth 2.0 を使用して API を保護する](https://docs.microsoft.com/ja-jp/azure/api-management/api-management-howto-protect-backend-with-aad)
- [API Management の価格](https://azure.microsoft.com/ja-jp/pricing/details/api-management/)