Insomnium から Azure API を利用する。

# What is this?
Rest API のクライアントツールの一種 [Insomnium](https://insomnia.rest/) を用いて 
Azure API を叩く手順です。

bearer をコピーして叩く方法と、[Insomnia plugin for Microsoft Entra ID](https://github.com/gilleszunino/insomnia-plugin-azure-ad-authentication?tab=readme-ov-file#insomnia-plugin-for-microsoft-entra-id) を用いる方法について示します。

# 手法1 : bearer をコピーする
Azure Portal にログインし、アクセス時に動作する API から bearer を抜き出します。
お奨めは [サブスクリプション] 画面の resources API から拾うことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/3d96e2c6-1d49-c2a5-b0bf-11c7c66aa171.png)

Insomnium を開き、[Bearer] セクションに内容を切り取り、貼り付けます。
(先頭の "Bearer" は不要です。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/5ea1c29a-6623-6783-1f61-7ef09ff6fdd3.png)

Headers タブを開き、 "Content-Type" を "application/json" として追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/36065100-5dc4-daab-918b-0e42790aed6b.png)

Body タブから "Json" を選択し、パラメータを設定します。
今回は [foracast](https://learn.microsoft.com/en-us/rest/api/cost-management/forecast/usage?view=rest-cost-management-2023-11-01&tabs=HTTP) API を使いますので、
URL は "https://management.azure.com/subscriptions/{SubscriptionGUID}/resourceGroups/{ResourceGroupName}/providers/Microsoft.CostManagement/query?api-version={APIversion}" となります。
パラメータは画面の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/30d25d70-6ce9-da2d-c828-b41d7e81406a.png)

Send を押下すると正常に State Code 200 及び、Result Json が取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/b7109615-5389-f1c4-6d3c-a09e84e6546f.png)

# 手法2 : Insomnia plugin for Microsoft Entra ID を利用する
"Insomnia plugin for Microsoft Entra ID" は Entra ID を用いたログイン用各設定を UI 形式で提供する、Microsoft のエンジニア Gilles Zunino 氏によるプラグインです。


原則、本手順は [plugin 公式 (github)](https://github.com/gilleszunino/insomnia-plugin-azure-ad-authentication?tab=readme-ov-file#insomnia-plugin-for-microsoft-entra-id) に準拠、シークレットキーによる認証についての手順となりますが、ドキュメントに記載のない各設定を補完します。
なお、シークレットキー以外の認証については私は未検証です。

## plugin の Install

1. Insomunium 起動後、メインメニュー [Application] - [Preferences] を選択します。
Insomnium Preferences ダイアログが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/8ae0bf13-25f0-d03e-5a45-be0ff4b43632.png)

2. [Plugin] タブを選択し、[Install Plugin] ボタン横のテキストボックスに
"insomnia-plugin-azure-ad-authentication" を入力、 Install Plugin ボタンを押下することでインストールが進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/8e285a5b-b963-ffdc-fc6b-d11061c4f34f.png)

インストール完了後はダイアログを閉じて構いません。
Plugin の適用後は、 [Header] タブ内の Value でサジェストにて呼び出しが可能です。
("Bearer E" などと打ち込むことでサジェストされます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/95d91fe6-e5ee-15ce-49f6-8d217be746a0.png)

サジェスト適用後、警告として赤ハイライトされますが、そこをクリックすることで各種入力用ダイアログが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/6da67e29-eaf8-a885-3acb-572a7192a7f0.png)

(設定入力用ダイアログ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/8bb314f3-42a0-3912-899e-81b47186797d.png)

## Azure Portal 側の設定
Azure Portal にて、アクセス用の SPN の設定および権限設定を行います。

### SPN の作成
[Microsoft Entra] のメニューから [アプリの登録] を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/39723cb8-cf9e-f601-95be-6a6a128931f0.png)

[新規作成] を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/87591796-b079-4eaf-ab06-5a84d77db8cd.png)

名前を決めます。ここでは "InsomniumTest" とします。その他のパラメータはあとで決めるのでここでは不要ですので、そのまま "登録" を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/1dbaa42e-48fd-46d9-8c4c-99f5018d881e.png)

SPN が作成されます。画像でマスクされているうち、"アプリケーション (クライアント) ID" と "ディレクトリ (テナント) ID" は後程使いますのでメモしておくとよいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/a04ad9b3-7e3b-872d-0fcb-a22874f43c3c.png)


続いて "証明書またはシークレットの追加" リンクを押下します。
"+ 新しいクライアントシークレット" を押下し、開かれる画面にて "追加" を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/de91c0b1-ee67-ff86-d0b8-950cf9391a72.png)

シークレットキーが作成されますので、手元のテキストなどに保存しておきます。
なお、このキーの取得ができるのはこのタイミングのみです。
紛失した場合、このシークレットキーは削除し再作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/58ca298d-175f-ce68-d625-e1ef40830cd0.png)

続いて左メニューから [概要] - [リダイレクト URI を追加する] を選択、押下します。 
遷移後の画面にて [+ プラットフォームを追加] を押下し、開かれる画面にて "モバイル アプリケーションとデスクトップ アプリケーション" を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/6a76f6de-2752-5a27-2086-4bfe45230a04.png)

カスタムリダイレクト URI に "任意のローカルホストの空きポート + '/redirect'" を指定し、[構成] を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/51f4f0b4-6361-e3dd-8040-e8ac7414c835.png)


カスタムリダイレクト URI が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/18ba37b2-5787-cdff-de25-b1e5790c5fce.png)

続いて左メニューから [概要] - [アプリケーション ID URI の追加] を選択、押下します。
遷移後の画面にて "アプリケーション ID の URI" 横の [追加] を押下し、開かれる画面にてそのままの値で "保存" を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/e5a837df-aa3e-224e-8909-2b35ff7cbb8c.png)

アプリケーション ID URI が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/67965266-e544-9fc0-8d4b-64114c55f63a.png)

SPN の設定は以上です。

### 権限設定
作成した SPN にサブスクリプションのアクセス設定を施します。

[サブスクリプション] ページから [アクセス制御] - [追加] - [ロールの割り当ての追加] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/71119de9-7a17-f1fa-036b-cf5ab2299692.png)

［閲覧者］ ロールを選択し、[メンバー] セクションに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/69fc8f54-b31b-2b6e-9813-7c37fb57994b.png)

検索して適用メンバーに SPN 名を指定し、レビューと割り当てを実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/29d98912-f4b7-5743-1253-6bd159166ec0.png)

正常終了すると、所有権が割り当てられていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/ff530ca1-e9d0-345e-4c19-5732ae7e2b91.png)


## Insomnium の設定
これまでの手順で Insomnium Plugin の必要な情報がそろいましたので、入力画面にそれぞれ設定していきます。
ここでのポイントは **Scope が "https://management.azure.com/.default" 固定であること**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/fb90d853-2490-5aee-5466-1480208085d3.png)


ex)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/26b0dcb1-5bb3-e42b-2186-46893550d6b1.png)

この状態で API を投げると結果が返ります。

# 各手法の良いところ / 悪いところ
## 手法1 : Bearer をコピーする
当然ですが Bearer Token には寿命があるので一定期間ごとにこの作業を行う必要があります。
これはバニラ環境のままでも使え、かつ漏洩の心配などがないセキュアな状態です。
一方でそれなりに手間ではあります。

## 手法2 : Insomnia plugin for Microsoft Entra ID を利用する
手順が面倒ですが、一度行ってしまえば Insomnia の設定に何か手を加えることはありません。
ただし、 SPN でアプリからのアクセスを許可する関係上、手順1 と比べると堅牢性は低下します。

# ぼやき
公式の "Scope" への設定情報間違ってますがな。ｘ。