【GraphAPI】Graph Explorer (2)：管理者の同意

# はじめに

※ この投稿は以下の記事の続きです。

https://qiita.com/atsmin77/items/a1d53031b120da5d9697

Graph Explorer からユーザー委任権限で Graph API を実行するためには、アクセス許可の付与が必要です。

この際に、一部のアクセス許可については、管理者の同意が必要となります。Graph API のアクセス許可を付与する際の、管理者の同意について紹介しています。

# 4. チームにメンバーを追加する

[3. チームを作成する](https://qiita.com/atsmin77/items/a1d53031b120da5d9697#3-%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) で作成したチームに、Graph API でチームメンバーを追加してみます。

以下の [チームにメンバーを追加する] Graph API を使用します。
(参考：チームにメンバーを追加する)
https://learn.microsoft.com/ja-jp/graph/api/team-post-members?view=graph-rest-1.0&tabs=http

## 4.1 URL の変更 

Graph API の公開情報の [HTTP 要求](https://learn.microsoft.com/ja-jp/graph/api/team-post-members?view=graph-rest-1.0&tabs=http#http-request) を確認すると、以下のように記載されています。
> HTTP 要求
> POST /teams/{team-id}/members

**"{team-id}"** と記載されているところは、チームメンバーを追加したチームの ID に置き換える必要があります。

::: note
今回のように、特定のデータに対して Graph API で操作を行う場合には、URL の中で対象となるデータの ID をし指定します。
:::

### チーム ID の確認

作成したチームの ID を Graph API で確認してみます。

[2. チームの一覧情報を取得する](https://qiita.com/atsmin77/private/a1d53031b120da5d9697#2-%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AE%E4%B8%80%E8%A6%A7%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B) で使用した、チームを一覧表示する Graph API を使用します。

Graph API では、<ins>フィルタ条件 (**$filter**) を指定して、取得する結果をキーワードで絞り込むことができます</ins>。

例えば、"テストチーム01" という名前のチームの情報を取得したい場合には、URL の最後に以下のような条件を追加します。

```
https://graph.microsoft.com/v1.0/teams?$filter=startswith(displayName,'テストチーム01') 
```

[Run query] から実行すると、フィルタ条件で指定した名前のチームの情報が取得されます。**[Response preview]** の **"id"** の値がチーム ID です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/21cb2ca3-c50f-4c97-9ef7-423b42f19309.png)

{team-id} を取得した ID で置き換えると、URL は以下のようになります。

```
POST /teams/d4923767-ea0d-4168-9422-108464d47b6d/members
```

(参考：フィルター クエリ 演算子を使用した例)
https://learn.microsoft.com/ja-jp/graph/filter-query-parameter?tabs=http#examples-using-the-filter-query-operator

::: note warn
フィルタ条件をサポートしていない Graph API もあります。各 Graph API がフィルタ条件をサポートしているかどうかは、公開情報の [オプションのクエリ パラメーター](https://learn.microsoft.com/ja-jp/graph/api/teams-list?view=graph-rest-1.0&tabs=http#optional-query-parameters) セクションに記載されています。
:::

## 4.2. 送信データの設定

次に、[3.2 送信データの設定](https://qiita.com/atsmin77/private/a1d53031b120da5d9697#32-%E9%80%81%E4%BF%A1%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%A8%AD%E5%AE%9A)と同じように、チームに追加するメンバーを送信データで指定します。

公開情報に記載されている例を確認します。
(参考：例 1: チームにメンバーを追加する)
https://learn.microsoft.com/ja-jp/graph/api/team-post-members?view=graph-rest-1.0&tabs=http#example-1-add-a-member-to-a-team
>{
    "@odata.type": "#microsoft.graph.aadUserConversationMember",
    "roles": ["owner"],
    "user@odata.bind": "https://graph.microsoft.com/v1.0/users('8b081ef6-4792-4def-b2c9-c363a1bf41d5')"
}

| 設定箇所 | 意味 |
|:-:|:-:|
| roles | 追加するユーザーのロール<br>所有者 (owner) またはメンバー (member) |
| user@odata.bind | 追加するユーザーの ID  |

::: note
追加するユーザーの ID は "https://graph.microsoft.com/v1.0/users('xxx')" の 'xxx' で指定します。
:::

### ユーザー ID の確認

[チーム ID](#チームIDの確認) と同様に、ユーザー一覧を取得する Graph API でフィルタ条件を使用して特定のユーザーを検索します。

(参考：ユーザーを一覧表示する)
https://learn.microsoft.com/ja-jp/graph/api/user-list?view=graph-rest-1.0&tabs=http

```
https://graph.microsoft.com/v1.0/users?$filter=startswith(displayName,'テスト ユーザー02')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/7f860e2d-c847-485e-b777-6d1bedc4cc56.png)

取得した ユーザー ID で置き換えます。今回は "roles" を "member" にしてメンバーとして追加してみます。

* 送信データ (Request Body)
```
{
    "@odata.type": "#microsoft.graph.aadUserConversationMember",
    "roles": ["member"],
    "user@odata.bind": "https://graph.microsoft.com/v1.0/users('0963c34e-f94e-49cf-bab8-b6b620fdb66f')"
}
```
Graph Explorer で URL と合わせて送信データを以下のように入力します。

* URL
```
POST https://graph.microsoft.com/v1.0/teams/d4923767-ea0d-4168-9422-108464d47b6d/members
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/617f34b0-4ac0-46c2-b178-e26964d11aaf.png)

## 4.3 アクセス許可の付与 (管理者の同意)

次に、[3.3 アクセス許可の付与](https://qiita.com/atsmin77/private/a1d53031b120da5d9697#33-%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E8%A8%B1%E5%8F%AF%E3%81%AE%E4%BB%98%E4%B8%8E) と同様に **[Modify Permissions]** タブから **"TeamMember.ReadWrite.All"** アクセス許可を付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/469772ec-b355-4ef1-8120-adae449b37d9.png)

しかし、一般ユーザーでログインしていると、[Consent] ボタンをクリックした際に以下のようなダイアログが表示され、アクセスを許可することができません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/39d47dbc-4e48-40b9-8995-46f7ed2ae02f.png)

[Modify Permissions] タブをよく見ると、**[Admin consent required]** (**管理者の同意が必要**) が **"Yes"** となっています。<ins>このようなアクセス権限は一般ユーザーでは許可することができません</ins>。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/ad9a5d3c-143a-4584-9c81-abee02cddb34.png)

#### 管理者の同意を行うために必要な管理者ロール

このようなアクセス許可は、以下のような管理者ロールを割り当てられている管理者ユーザーのみ、許可することができます。

* 特権ロール管理者
* クラウドアプリケーション管理者
* アプリケーション管理者

(参考：前提条件)
https://learn.microsoft.com/ja-jp/entra/identity/enterprise-apps/grant-admin-consent?pivots=portal#prerequisites

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/524aae44-bd71-4028-a52b-9549822b12c2.png)

上記のようなロールが割り当てられているユーザーで Graph Explorer にサインインして、同様に [Consent] ボタンをクリックすると、アクセスを許可するダイアログが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/ddb9694a-d7d5-4b1e-a8c1-61b8dec0c437.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/c7e001a9-24f5-4e51-9bd3-b8beed10dbdd.png)

::: note
**[組織の代理として同意する]** に✅すると、組織内の一般ユーザーもこのアクセス許可を使用して Graph API を実行することができるようになります。
:::

::: note warn
一般ユーザーが実行することを許可したくない場合には [組織の代理として同意する] を✅しないようにします。
:::

アクセス許可を付与したら、[Run query] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/837047be-de46-4f99-8646-d7a5a04c02e6.png)

Teams クライアントから確認すると、指定したユーザーがチームにメンバーとして追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/1c78c4e8-e1e6-4656-969d-0785204b9d43.png)

## 4.4 補足

### 管理者の同意を取り消す方法

Graph Explorer から管理者が同意したアクセス許可は、Entra ID 管理センターから取り消すことができます。

1. Entra ID 管理センターから **[アプリケーション] - [エンタープライズアプリケーション] - [Graph Explorer]** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/d86d7065-312d-4cc7-b690-d06c15615aee.png)
1. **[アクセス許可] - [管理者の同意]** タブから取り消したいアクセス許可の右側 **[…]** より **[アクセス許可の取り消し]** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/5cc1045c-dbef-4390-99fd-cbdb4bdba086.png)
1. 確認ダイアログが表示され、**[はい、取り消します]** をクリックするとアクセス許可を取り消すことができます

### すべてのアクセス許可で管理者の同意を必要とする方法

既定では [[Admin consent required]](#43-アクセス許可の付与-管理者の同意) が **"No"** となっているアクセス許可は管理者の同意なくユーザーが利用できます。



以下の手順で、すべてのアクセス許可について管理者の同意が必要にできます。
1. Entra 管理センターから **[アプリケーション] - [エンタープライズアプリケーション] - [同意とアクセス許可]** をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/1d4db8fa-8702-45b4-b13c-14a576ce2783.png)
1. **[ユーザーの同意設定]** で **[ユーザーの同意を許可しない]** を選択し、**[保存]** します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/1a3db305-d049-4b29-a0ef-2477f3b4ca7b.png)

この設定を行うと、すべてのアクセス許可で管理者の同意が必要となります。ユーザーが管理者の同意していないアクセス許可を利用しようとすると、以下のダイアログが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/c81f4fff-a5d8-4426-b612-1d2dad6b535a.png)


(参考：ユーザーがアプリケーションに同意する方法を構成する)
https://learn.microsoft.com/ja-jp/entra/identity/enterprise-apps/configure-user-consent?pivots=portal