LINE WORKSのJWT認証トークンをGetする

## PowerAutomateのフロー実行時などにトークンを都度発行したい

LINE WORKS API2.0のAccess Tokenは、有効期限が24時間、Refresh Tokenの期限が3か月です
なのでPowerAutomateのフローなどでLINE WORKSのAPIを定期実行したい場合などは
3か月おきにRefresh Tokenを更新するなどメンテが必要です

それは面倒なので、PowerAutomateのフロー内でJWT認証処理のやりようがないかと色々調べてみたものの、どうやらダメそうで。

そこで、Getリクエストを受けるとJWT認証の処理を行い、Access Tokenを返してくれるWebアプリをGASで作ってみました。
これを例えばPowerAutomateのフローに組み込めば、実行の度にAccess Tokenを取得できます。

JWT認証のAccess Tokenについて公式ドキュメントは[こちら](https://developers.worksmobile.com/jp/reference/authorization-sa?lang=ja)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/10e9d6d6-66ad-fcaa-7fb5-eda844840918.png)



## 必要なもの
* Googleアカウント（無償でもOK）
* LINE WORKS Developers Consoleへのアクセス権限を持つID
* [LINE WORKS 便利ツール](https://qiita.com/nonattonolife/items/16181d666b8246e3f28d)


## 事前準備

### 1. LINE WORKS便利ツールの準備

以下の手順に従い、便利ツールの事前準備をします

https://qiita.com/nonattonolife/items/16181d666b8246e3f28d

### 2. Webアプリ URLの準備

便利ツールの準備ができたら、Googleシートの「**拡張機能**」メニューから「**Apps Script**」を開きます


<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/ae5ac3f9-5eec-9d02-f692-7e8ba9da254c.png">

**getJwt.gs** ファイルを選択して、
画面右上の青色の「**デプロイ**」＞「新しいデプロイ」をクリックします。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/b8326a44-8131-0dbe-7148-b3713ea0cf4e.png">

「アクセスできるユーザー」を「**全員**」にセットして
「デプロイ」ボタンをクリックします

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/7192dec2-f8c9-699c-bb77-de4e7cf2d277.png">

**「ウェブアプリ」のURLをコピー**しておきます

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/ddad41d7-d633-6c4b-1cee-31cff757424b.png">



## PowerAutomateでフローを作成

### 1. HTTP Get リクエストをつくる

とりあえずテスト利用してみたい場合は、手動でトリガーなどを選択してください

作成済みのフローに組み込む場合は、
「アクションの追加」より、**HTTP**を追加します

　方法：**GET**を選択
　URI：先ほどコピーしたGAS Webアプリの**URLを貼り付け**
　ヘッダー：以下を指定
　**Content-Type | application/json**
　**Accept | application/json**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/918164a1-518e-e5a2-dc3b-69335dbfbc8e.png)

### 2. リダイレクトURLを取得する

１回目のHTTP GETリクエストでは、まだTokenは取得できません。
Google側のセキュリティ仕様のため、GETリクエストに対して、「エラー302」を返し、同時にワンタイムのリダイレクトURLをヘッダーに指定して渡してきます。
このリダイレクトURLに対して、以下の手順にて改めてHTTP GETする必要があります。

(@iwaohig さんの以下の記事を参考にさせていただきました！
https://qiita.com/iwaohig/items/d0c19ea6e547c3f345c8）

次のアクションとして、**HTTP**を追加します
　方法：**GET**を選択
　URI：数式（**outputs('HTTP')['headers']['Location']**）を入力
　ヘッダーに**Content-Type | application/json**を指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/13a88ac7-06cf-7342-8f81-f551bb8bb8f0.png)

**数式の指定のやり方**
URIにカーソルを合わせて、ポップアップウィンドウの「式」を選択し
outputs('HTTP')['headers']['Location']　を入力し、「完了」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/e1e18cf4-0010-f180-b802-1e19f6fd3776.png)

次に、HTTPの詳細設定ボタンから「**実行条件の構成**」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/b24e3abb-9751-fa27-1ecc-85db1babb456.png)

「**失敗しました**」にチェックを入れて、「**完了**」
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/391fb3a7-22dc-7224-a386-a6f81dfa6009.png">

### 2. 取得したJSONをパースする

次のステップに「**JSONの解析**（Parse JSON)」を追加します。
コンテンツ：HTTP 2で取得した「**本文**」を動的なコンテンツとして追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/ddcc5871-dcf2-7fa3-90bd-463f990b4f37.png)

スキーマ：以下の**スキーマを貼り付け**
(※上のスクショではdomainIdのtypeがstringになっていますが、integerの誤りです）
```
{
    "type": "object",
    "properties": {
        "domainId": {
            "type": "integer"
        },
        "token": {
            "type": "string"
        }
    }
}
```

これでトークンを取得する準備完了です！

### 3. 取得したトークンを使ってみる

試しにBotからメッセージ送信してみます。

次のステップに「**HTTP**」を追加します

　方法：**POST**
　URI：以下リクエストURLの変数{botId}と{ユーザID}をご自身の環境に合わせた値を指定ください
　https://www.worksapis.com/v1.0/bots/{botId}/users/{userId}/messages
　ヘッダー：以下の値を入力
　**Authorization | Bearer<半角スペース>token**（動的コンテンツ）
　**Content-Type | application/json**
　本文：以下の値を入力
```
{
  "content": {
    "type": "text",
    "text": "もうすぐ春ですね❣"
  }
}
```

<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/87ab88ae-7a37-c732-d1e5-49b993c3a080.png">

フローを実行してみます
最初のHTTP GETは、Google Appsより302が返るのでエラーが起きてるようにみえますが、
リダイレクト先URLに対して、次のHTTP GETが成功しています

<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/2f4f6811-a540-8172-3a4c-6b600cac2de6.png">

無事、トークンを取得でき、Bot APIを使ってメッセージの送信ができています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727469/ecda6a72-8e9d-30ed-17d4-91b9f0900227.png)