Outlookの予定表をバックエンドから作成する

# はじめに
Webシステムで管理している情報をOutlookの予定表に出力、削除を行います
バックエンドと書いていますが、本記事ではREST Apiを呼んで操作を行います。
ユーザアクセスの必要がない方法なので、バッチやWebサービスから操作することが出来ます

# 必要なもの
* Azureサブスクリプション
* AzureActiveDirectryo(以下AAD)の管理者権限（他人に依頼しても可）
* Restを叩ける環境（本記事ではVSCodeのREST Clientを使用）

# 準備
まずはAADの権限周りを設定しましょう
AADにアクセス
アプリの登録から新規登録を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/83621248-d7f7-bf54-d212-e7232d37cc69.png)

名称を入力し登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/37b2ce3c-2eb3-ec7a-2273-ae34903d5813.png)

APIアクセス許可からアクセス許可の追加を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/3ce1533e-5f29-6825-7c58-e60aefa2f29c.png)

大きすぎてボタンと思わないMicrosoftGraphを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/da42a4f6-573d-827d-6476-7802eb1b92fb.png)

アプリケーションの許可を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/73a707f6-c261-1ba1-9f20-cf410e1397a5.png)

calendarと入力し、検索結果のCalendards.ReadWriteを選択しアクセス許可の追加を選択
今回はカレンダーのイベント作成を行うので、上記の権限ですが、それ以外は
[MicrosoftGraph](https://docs.microsoft.com/ja-jp/graph/api/user-post-calendars?view=graph-rest-1.0&tabs=http)の
ページを確認して適切な権限を付与しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/86db5bb9-54bf-f8a3-e4be-bebd8a99cdbe.png)

証明書とシークレットから新しいクライアントシークレットを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/88be1a96-34aa-fb98-159f-8f225cb6ee55.png)

クライアントシークレットの説明と有効期限を選択し追加を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/eeda5554-a67b-5fbb-0b45-da0100b16d8b.png)

値をどこかに保存しておきましょう。これは再表示されません。パスワード的なものですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/da888fcf-12eb-d186-2304-45b57e081410.png)

AAD管理者でログインし***に管理者の同意を与えますを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/e6ce0245-6b03-1161-47a8-ff805399c300.png)

アプリケーション(クライアント)とディレクトリ(テナント)IDを保存しておきましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/993e412d-97a0-7120-5c92-29dd7b52dad7.png)


# いよいよカレンダーイベント作成
流れは
MicrosoftGraphにログインするとトークンが返ってくるので、WebAPIにセットし各種APIを呼び出す

## MicrosoftGraphにログイン

```
@ClientID=保存しておいたアプリケーション(クライアント)
@ClientSecret=保存しておいたクライアントシークレットの値
@Tenant=保存しておいたディレクトリ(テナント)ID
POST https://login.microsoftonline.com/{{Tenant}}/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id={{ClientID}}
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret={{ClientSecret }}
&grant_type=client_credentials
```

VSCodeのRESTClientだとCtrl+Alt+rでコマンドを発射できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/f8982b65-7c6e-7a41-3ab9-d5d867e8ed0f.png)

ログインに成功するとaccess_tokenが返ってきますので、保存しておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/d41e1808-80f8-af16-ca68-442314e442e8.png)

## 予定を作成する
それでは予定を作成してみましょう。
UserId：予定を作成するユーザ(メールアドレス）
AADToekn：ログインで得られたトークンにBearer をつけたもの
Json：予定情報
transactionId：ユニークID(GUIDがいいと思います)

```
@UserId =hogehoge@test365.onmicrosoft.com
@AADToekn=Bearer eyJ0eXAiOiJKV1QiLCJ...............
###
post https://graph.microsoft.com/v1.0/users/{{UserId}}/calendar/events
Content-type: application/json
Authorization: {{ AADToekn }}

{
  "subject": "test",
  "start": {
      "dateTime": "2022-01-04T00:00:00",
      "timeZone": "Asia/Tokyo"
  },
  "end": {
      "dateTime": "2022-01-05T00:00:00",
      "timeZone": "Asia/Tokyo"
  },
  "location":{
      "displayName":"年始の出勤"
  },
  "isAllDay":true,

  "transactionId":"F0A42756-575E-4590-82D6-4C18FCD2355F"
}
```
jsonのプロパティは[eventリソースの種類](https://docs.microsoft.com/ja-jp/graph/api/resources/event?view=graph-rest-1.0)から確認できます

Outlookの予定表で確認してみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/a0dc37d5-f526-f927-0326-c630eb441049.png)

```
@UserId =hogehoge@test365.onmicrosoft.com
@AADToekn=Bearer eyJ0eXAiOiJKV1QiLC........
@id=AAMkAGRhO.....
delete https://graph.microsoft.com/v1.0/users/{{UserId}}/calendar/events/{{id}}
Authorization: {{ AADToekn }}
```
で削除も可能です。
idは予定を作成した時のレスポンスに入っています。