Konnectのログイン認証をEntra ID(旧Azure AD)で行う

過去にKong Gateway/KonnectとEntra IDの連携関連のメモは以下で書いてきた。
- [KonnectのDev Portalの認証にEntra ID(AzureAD)を利用する](https://qiita.com/ipppppei/items/7da1349bb50532b94f54)
- [APIの認証をEntra ID(旧Azure AD)で行う](https://qiita.com/ipppppei/items/a975dccf56d5f89a1ccf)
- [既存のEntra IDをKong Managerの認証に使う](https://qiita.com/ipppppei/items/c99c63c0bad23c9cfab3)

ただ、まだKonnectのログイン認証の検証はやっていなかったので、ここではその手順を確認する。

## 前提

検証開始時、以下が揃っているものとする。

- [Konnect](https://cloud.konghq.com/)にログインできる
- アプリが作成済みで、以下を既に入手済み
  - クライアントID
  - クライアントシークレットの値
  - IssuerのURL

アプリの作成については過去の[こちら](https://qiita.com/ipppppei/items/7da1349bb50532b94f54#azure%E5%81%B4%E3%81%AE%E8%A8%AD%E5%AE%9A)の記事にまとめている。
なお、リダイレクトURIは`https://cloud.konghq.com/login`となる。

また今回はOIDCでログインしたユーザはKonnectのデフォルトのチームである[Organization Admin](https://docs.konghq.com/konnect/org-management/teams-and-roles/teams-reference/)に所属させて、Teamに割り当たっている権限が使えるようにするところをゴールとする。

## 連携手順の確認

### Entra ID設定
ここまででEntra IDのアプリの作成は終わっているが、ロールの作成は未実施である。
ロールはKonnectのTeamとマッピングするために作成し、ログインユーザに権限を与えるために利用する。

ロールの作成はアプリの`アプリロール`から`アプリロールの作成`を選択して行う。

![20240918162037.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/bd2f8f9a-442c-30d7-9807-6c7c6068b95a.png)

アプリロールの作成画面になるので、各項目を埋めて作成する。
ここでは以下のようにした。
- 表示名：`OrgAdmin for Konnect`
- 許可されたメンバーの種類：`ユーザーまたはグループ`
- 値：`OrgAdmin`
- 説明：`Role for Team in Konnect`

ここの値はKonnect内のTeamとのマッピングで利用する。
なお、Kong Gateway Enterprise版と異なり`<Workspace名>:<ロール名>`のような制約はないので好きな値にしてもらって問題ない。

次にロールとEntra IDのユーザとの紐づけを行う。
Entra IDの`エンタープライズアプリケーション`から作成したアプリを選択し、`ユーザーとグループ`から`ユーザーまたはグループの追加`を選択してKonnectを利用するユーザにロールを割り当てる。

割り当てが終われば`ユーザーとグループ`から割当たっていることが確認できる。
![20240918164537.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/114cdc71-c21d-9878-c663-b063543d6f82.png)


以上でEntra IDの設定は終了となる。

### Konnect設定

OIDCの設定を行い、先程作成したロールとTeamを紐づけてログインユーザがKonnect内で操作を出来るように設定する。
まずKonnectにログインし、`Organization`->`Settings`から`Authentication Scheme`のタブの中にあるOIDCの`Configure`をクリックする。
![20240918133729.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/fa1740ad-f1a2-dcef-b963-81b97ca80b22.png)

最初に以下の入力項目を入力する。
- Issuer URI
- Client ID
- Client Secret
- Organization Login Path

`Issuer URI`、`Client ID`、`Client Secret`についてはEntra IDで取得したものを入力する。
`Organization Login Path`についてはOIDCログインのURLのためのパスであり、`https://cloud.konghq.com/login/<指定した値>`でOIDCログインが出来るようになる。

上記値設定後、Entra ID固有の設定をAdvanced Settings部分に行う。
- Scopes：`<Client ID>/.default`を追加
- Claim Mappings：Groupsを`roles`に変更

以下のような感じで入力したら、Saveをクリックする。
![20240918165608.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/fb4fa482-037e-c57f-7b8c-a2bacfbe98ae.png)
Saveすると以下のようにOIDCが`Configured`かつ`Disabled`になる。
![20240918165931.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/8b73d64b-3511-fce0-d638-3834147719a9.png)

OIDCの横の`︙`をクリックし、`Enable OIDC`をクリックしてOIDC連携を有効化する。
有効化したタイミングで認証を使ってログイン出来るようになるが、権限とのマッピングが終わっていないので操作がまともに出来ない。
権限を与えるためにマッピングを行う。
`Authentication Scheme`のタブの横にある`Team Mappings`をクリックし`Idp Mapping Enabled`のチェックボックスを有効化する。
有効化するとTeam名とGroup Nameのマッピング画面が出てくるので、Organization Adminに先ほどロール作成時に設定した値（ここでは`OrgAdmin`）を設定する。
![20240918170431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/c648e6b8-d3f4-4fd9-7308-2aa928b492f9.png)

Saveをクリックして保存したら設定は終了となる。

### 動作確認
`https://cloud.konghq.com/login/<Organization Login Pathで指定した値>`にアクセスするとEntra IDの認証が求められるので入力して先に進む。
ログイン後、ログインしたユーザのTeamを確認すると、適切にマッピングされていることが確認できる。
![20240918174318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/b8e01301-75d6-a566-a75a-b71b8268ec0d.png)

またControl Planeの作成など各種操作が行えることも確認できる。

## ハマりどころ

アプリのロールとKonnectのTeamのマッピングが上手く行かないと、以下の画面を見続けることになる。
![20240918151553.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/c50af61f-5e35-e8ce-4ed1-7d23f2df0d64.png)

上手く行かない場合は以下あたりを見直してみると良いと思う。
- ロール名とTeam Mappingで設定したGroup Nameが一致するか
- Claim Mappingsの設定でGroupsに`roles`を設定しているか
- OIDCをEnabledにしているか