Azure API Management - OpenID Connect 認証設定

# 目的

Azure API Management で `OpenID Connect` 認証を設定する方法を確認する
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/1bbe80b1-5b9a-b572-58f7-4f20cf475daa.png)

# 前提

Azure API ManagementでAPIは作成済
作成方法は以下を参照
[Azure API Management - SwaggerからのAPIインポート、Functionsとの連携](https://qiita.com/takmot/items/6605ab69fb49d930c4a0)

# 概要

（Azure AD 設定）
1．アプリケーションを Azure AD に登録
2．クライアントシークレットの作成
3．アプリケーションID URIの追加
4．OpenID Connect メタデータ ドキュメントのエンドポイント確認
6．リダイレクトURIを Azure AD に登録（※開発者ポータル用の設定）

（API Management 設定）
5．OpenID Connect Serverの作成（※開発者ポータル用の設定）
7．APIのセキュリティ設定（※開発者ポータル用の設定）
8．Inbound processing設定

（開発者ポータル）
9．開発者ポータルを使用した動作確認

# 手順

## 1．アプリケーションを Azure AD に登録

(1)．Azure portalの `Azure Active Directory`で、`アプリの登録` → `＋ 新規登録`を選択
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/ab68e528-0f28-6afa-85e9-87878f2dd8e0.png)

(2)．任意のアプリケーション名を入力、その他は変更なしで登録をクリック
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/70920e64-956d-be17-4ede-dc4905ab9336.png)

## 2．クライアントシークレットの作成

(1)．Azure portalの `Azure Active Directory`で、`アプリの登録` → 登録したアプリを選択 → `証明書とシークレット` → `＋ 新しいクライアントシークレット`を選択
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/781cb2bb-6534-e5d0-55be-0bbc48a45e28.png)

(2)．任意の説明を入力し追加をクリック、生成された以下**クライアントシークレットの値 [*1]**は後程使用する
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/7c172558-1e97-4293-fb72-2417f277108e.png)

## 3．アプリケーションID URIの追加

(1)．Azure portalの `Azure Active Directory`で、`アプリの登録` → 登録したアプリを選択 → `概要`を選択
(2)．**アプリケーション (クライアント)ID [*2]**は後程使用する
(3)．`アプリケーションID URIの追加`を選択
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/8cde9ba4-ad3e-8085-7d68-c9d9724bb46d.png)

(4)．`設定`を選択
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/0b2c12ab-34f9-52b2-b7b3-ecadabd28498.png)

## 4．OpenID Connect メタデータ ドキュメントのエンドポイント確認

(1)．Azure portalの `Azure Active Directory`で、`アプリの登録` → 登録したアプリを選択 → `概要` → `エンドポイント`を選択
(1)．**OpenID Connect メタデータ ドキュメント [*3]**は後程使用する
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/84262a9d-4547-5fb2-1c7d-d964317166f8.png)

## 5．OpenID Connect Serverの作成

※手順9.(4) 開発者ポータルで `Authorization`を選択した際に、開発者ポータルがAzure ADから`idToken`を取得するための情報設定
![50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/16159420-b5e0-95af-0db6-f829571dd566.png)


(1)．Azure portalの `API Management`で、`OAuth 2.0 + OpenID Connect` → `OpenID Connect タブ` → `＋ 追加`を選択
(2)．任意の名前を入力
(3)．メタデータ エンドポイント URLに**OpenID Connect メタデータ ドキュメント [*3]**を入力
(4)．クライアント IDに**アプリケーション (クライアント)ID [*2]**を入力
(5)．クライアントシークレットに**クライアントシークレットの値 [*1]**を入力
(6)．作成をクリック
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/d3c9bf23-bab8-c7f2-8d4a-460f1424cb6d.png)

## 6．リダイレクトURIを Azure AD に登録

※手順9.(4) 開発者ポータルがAzure ADから `idToken`取得後にリダイレクトするURIの設定

(1)．作成したOpenID Connect Server 設定の**許可コード付与フロー [*4]**,**暗黙的な許可フロー [*5]**は後程使用する
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/0dd699ec-f70e-e8ce-1c5f-b29afb1f270a.png)

(2)．Azure portalの `Azure Active Directory`で、`アプリの登録` → 登録したアプリを選択 → `概要` → `リダイレクト URIを追加する`を選択
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/7e7774d2-301b-3dcf-0922-ed85af20ad79.png)

(3)．`＋ プラットフォームを追加` → `Web`を選択
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/02febb9c-b521-37d5-1bfa-5cd82810de6b.png)

(4)．リダイレクトURIに**許可コード付与フロー [*4]**を入力、IDトークンにチェック、構成をクリック
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/99bdd2b7-2e93-6f2a-7289-2562ea523596.png)

(5)．続けて、`URIの追加`を選択、**暗黙的な許可フロー [*5]**を入力、保存をクリック
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/f2818887-f25d-b029-d823-48bd250a97f5.png)

## 7．APIのセキュリティ設定

※手順9.(4) 開発者ポータルの `Authorization`欄に `OpenID Connect`の項目を追加するための設定
![50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/9793c354-eabf-420f-86e1-b3df82623761.png)

(1)．Azure portalの `API Management`で、`API` → 対象のAPIのSettingタブ → `Security`項目の `OpenID connect`を選択 → 作成したOpenID Connect Serverを選択
![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/a00175ac-cae7-9b41-1907-1010b80eda40.png)

## 8．Inbound processing設定

(1)．Azure portalの `API Management`で、`API` → 対象のAPIのDesignタブ → `All operations` → `＋ Add Policy`を選択
![31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/672cea3e-012b-88cc-4ae3-93a5d5940260.png)

(2)．Validate JWTを選択
![32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/1b51c6b0-dc19-35a2-fe78-5725ffe6a026.png)

(3)．Header name に `Authorization`を入力
(4)．Faild validation error messageに 認証エラー時にレスポンスするメッセージを入力
(5)．Required claimsに、Name `aud`、Values **アプリケーション (クライアント)ID [*2]**を追加
(6)．Open ID URLsに**OpenID Connect メタデータ ドキュメント [*3]**を入力
(7)．Saveをクリック
![33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/16c25ec1-5c90-e479-822c-9d3b46c07d1e.png)

## 9．開発者ポータルを使用した動作確認

(1)．Azure portalの `API Management`で、対象のAPIを選択 → `サブスクリプション` → `主キー`の値（**サブスクリプションキー [*6]**）は後程使用する
![39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/654f6ae3-4280-6d3a-7e4b-9e9497a21ef8.png)


(1)．ブラウザをシークレットウィンドウで開く
![40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/011aa7f1-d71d-f9ab-43fc-732eab1a8bc3.png)

(2)．ブラウザで開発者ポータルのURLに移動
![41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/9de87173-2bc6-615f-6dd0-768cda4e32c1.png)

(3)．`APIs`から動作確認するAPIを選択 → `Try it`をクリック
![42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/5fe91daf-647e-fb04-7372-6ab1f7908e34.png)

(4)．作成したOpenID Connect Serve名の項目で `implicit`を選択、アクセス許可ダイアログが表示されるので承諾
(5)．Subscription keyの項目に**サブスクリプションキー [*6]**を入力
![43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/f74e07b3-4ad5-e1c3-d9ec-6a78db31ee33.png)

(6)．Headersに `Authorization`　と `Ocp-Apim-Subscription-Key`が追加されていることを確認
![44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/fe3cf8d7-2e24-1cd5-9a77-d3e2276b87fa.png)

(7)．Sendボタンをクリックし、`200 OK`が返ってくることを確認
![45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/20b1e261-ba02-4f0d-7639-eade4b2aa903.png)

(8)．Headersに `Authorization`を載せなかった場合は認証に失敗することを確認
![46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/bddd7149-012d-ba57-3927-83af622ecac5.png)