PostMan を使った Graph API の始め方 

#0. はじめに
[公開情報](https://docs.microsoft.com/ja-jp/graph/tutorials) を見れば良いのですが、 わかりにくく感じる方や、細々と読むのがめんどくさい方、これから Graph API を使う方向けに個人的に解説してみました。
本記事では、なるべくシンプルに Graph API を利用するために事前に用意するものや認証方法について大雑把に触れ、API の テストツールである POSTMAN で Graph API を利用できるところまでを解説します。なお、本記事の"2. Graph API の事前準備 (Azure AD 側)" まではどのプラットフォーム / 言語 でもだいたい手順は共通であるため参考にはなるかと思います。

#1. Graph API の認証の流れ
ざっくりとは以下のような流れになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/aa1c18be-7127-39e8-00a0-b9b2f2b44d92.png)


上述の図における ① では、Azure AD アプリ (API 用のアカウントのようなもの) を使って Azure AD から Graph API にアクセスに必要なアクセストークンをクライアントが取得します。アクセストークン取得後、クライアントは改めて上述の図 ③の段階で本丸の Graph API をリクエストします。

このような認証の流れとなるため、Graph API を利用するにはまず 事前に Azure AD へのアプリ登録や設定が必要になります。

# 2. Graph API の事前準備 (Azure AD 側) 
##2.1. Azure AD へのアプリ登録
それでは Azure AD へのアプリ登録から始めてみましょう。
Azure Portal へアクセスし [Azure Active Directory] > [アプリの登録] をクリックします。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/17fb21f5-6477-36cf-215a-b692a1f6ee8f.png)

[+ 新規登録ボタン] をクリックし、 "名前" に任意の文字を入力したら登録をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/9e1c1067-5e98-2188-3379-b5b2cb1daa76.png)
※リダイレクト URI は Graph API で利用するプラットフォームや言語によっては入力する必要があります。今回は特に登録する必要がないので割愛します。

##2.2.Azure AD のアプリに権限を付与する
さてここからはこの アプリに実行を許可するGraph API を指定していきます。
何を言っているかというと [Graph API リファレンス](https://docs.microsoft.com/en-us/graph/api/overview?view=graph-rest-1.0) に記載されている通り、Graph API にはたくさんの API があります。その API の中で利用したい特定の API だけに実行権限を付与する作業になります。

[Azure Active Directory] > [アプリの登録] > "先程作成したアプリ" > [API のアクセス許可] へ移動し、[アクセス許可の追加] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/a2303bcf-c4f0-7f29-bd39-9b7ac8f3ede3.png)

[Microsoft Graph] を選択し、 [アプリケーションの許可] をクリックし必要な API の権限にチェックを入れ最後に [アクセス許可の追加] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/93e369ae-3b74-fa71-9273-5fa228c28d90.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/f508e08f-146d-8c58-d31e-97cecba3280c.png)

最後に、[xx に管理者の同意を与えます]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/e943ec5f-928a-270d-c3b8-435499c61301.png)


<details><summary>※補足 1: どの API の権限にチェックを入れたらよいかわからない方へ</summary>
[Graph API リファレンス](https://docs.microsoft.com/en-us/graph/api/overview?view=graph-rest-1.0) を見るとわかります。なぜならリファレンスのカテゴリーと [API のアクセス許可の要求]のページに表示されるカテゴリーは大体一致しているためです。
例えばユーザー情報の読み取り権限だけを与えたい場合、リファレンスを参照するとカテゴリーが "User" となっているので、"API アクセス許可の要求" のページにて [User] を選択すると、[User.Read.All] があるためこれにチェックを入れれば良いといった感じにわかります。</details>
<details><summary>※補足 2: 認可されたアクセス許可について</summary>
主にWeb アプリなどで使います。ユーザーにアプリが xx の情報にアクセスします。同意しますかとポップアップが出てくるやつです</details>
<details><summary>※補足 3: アプリケーションの許可について</summary>
主に自動化などで使います。Web アプリなどと違ってユーザーにアプリが xx の情報にアクセスします。同意しますかというポップアップが出ませんが代わりに Azure AD で事前に同意を行って置きます。</details>
<details><summary>※補足 4: なぜ Graph API は Azure AD のアプリ登録を使うのか</summary>
これは私個人の意見ですが、従来の Rest API に対する課題を解決する方法として Azure AD のアプリ登録の機能を利用していると考えています。従来の Rest API の場合 API 毎にその利用の可否を制限するといった考え方がなく、すべての実行権限を保有する API キーを払い出すだけであり、API を使って連携する外部のアプリに過剰な権限を与えてしまうという課題がありました。
そのため Graph API では、Azure AD へアプリとして登録することで Azure AD によって API の実行権限を細かく制御、管理できるようにする狙いがあると考えています。より正確には OAuth や Open ID Connect という仕組みを利用するために Azure AD を使っているのですが、長くなるので割愛します。OAuth や Open ID Connect に興味のある方は別途調べてみてください。</details>

##2.3. Azure AD のアプリのシークレットクライアントを生成する
さてこの節で Azure AD へのアプリ登録の最後となります。
ここではクライアントが Azure AD のアプリへアクセストークンを要求するときに必要なクライアントシークレット (パスワードのようなもの) を生成します。

[Azure Active Directory] > [アプリの登録] > "先程作成したアプリ" > [証明書とシークレット] に移動します。
次に、[新しいクライアント シークレット] をクリックし、任意で "説明" に文字列を入力し、 "有効期限" にも設定し、[追加] をクリックします。
※ Azure Portal からは 1 年,2 年, なし のみの選択可能ですが [Power Shell コマンド](https://docs.microsoft.com/ja-jp/powershell/module/azuread/new-azureadapplicationpasswordcredential?view=azureadps-2.0) を利用することで任意の期間を指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/cb6bc039-8020-9e5d-bfd3-b1543722c6f1.png)

"クライアント シークレット" の値をコピーしメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/debb0fad-4052-44ae-af54-51a3379ab76f.png)
更に、[Azure Active Directory] > [アプリの登録] > [概要]に移動して、"アプリケーション (クライアント) ID", "ディレクトリ (テナント) ID"　の値をコピーしメモしておきます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/2357debb-d5a5-6f96-f6e1-b6afb68befbc.png)

#3. クライアント (POSTMAN) 側の設定
ここからは POST MAN 側の設定を行っていきます。別プラットフォームの場合は[公開情報](https://docs.microsoft.com/ja-jp/graph/tutorials)を参照してください。
また [POSTMAN の設定](https://docs.microsoft.com/ja-jp/graph/use-postman)自体もMicrosoft の公開情報に記載されていますが、折角なので解説しておきます。

まだ POSTMAN をインストールしていない場合は[ここから](https://www.postman.com/downloads/) ダウンロードします。
次に POSTMAN を起動し、[File] > [Import...] > [Import from Link] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/28f3726e-bc45-462f-914a-9be5be7e4149.png)

以下の 2 つの URL をそれぞれ入力し、 [Import] をクリックします。

```
https://raw.githubusercontent.com/microsoftgraph/microsoftgraph-postman-collections/master/Microsoft%20Graph.postman_collection.json
```

```
https://raw.githubusercontent.com/microsoftgraph/microsoftgraph-postman-collections/master/Microsoft%20Graph.postman_environment.json
```

右上隅の [No Enviroment] ドロップダウンを選択し、[Microsoft Graph 環境] を選択します。
右の 目のアイコンを選択し、[編集] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/708c642a-2378-5a67-d460-f332ff9f9c37.png)


前節で2.3. でメモしておいた クライアント ID、クライアントシークレット、テナント IDを "Current Value" に入力し、[Update] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/c81fae50-9f7b-4730-2a47-c86fd79283f6.png)


#4. POST MAN で Graph API をテストしてみる
## 4.1. アクセストークンを取得する
左側にある [MicrosoftGraph] > [Application] > [Get App-only Access Token] を選択します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/6b573abc-7c1a-92ca-2e68-a4985c1c82b6.png)

すると アクセストークンが以下のキャプチャのように取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/bc42ffde-1cba-367f-cdb5-06ceb23bd354.png)

## 4.2. Graph API をリクエストする
いよいよ、Graph API を使っていきます。本記事ではユーザー情報の一覧取得の APIを使ってみます。
左側にある [MicrosoftGraph] > [User] > [Get Users] を選択し、[Send] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/f589c8f0-1fdd-56ed-499f-aab76cc50508.png)
このような形で POSTMAN を利用すれば特にコーディングを必要とすることなく Graph API を利用することができます。

#5. おまけアクセストークンの中身を見てみる
取得したアクセストークンは、 JWT 形式で記述されているため、 Base 64 でデコードすればどこでも見れるのですが、以下のサイトを使うと見やすいです
https://jwt.ms/
上記サイトでデコードすると以下のような形で情報を見ることができます。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144326/81ce07a6-14bd-4f47-76e5-c56eb51c2757.png)

このアクセストークンには有効期限や許可されている API や権限などが記載されています。
Graph API はこのアクセストークンをつけてリクエストすることで Azure AD に認証してもらってます。
普段はあまり意識することはないかもしれませんがトラブルシュートの際には役立つ情報です。