【LINE WORKS】Bubbleで掲示板投稿アプリを作ってみる【API 2.0】

# はじめに
4/1にLINE WORKS APIの新しいバージョン「API2.0」が正式リリースされ、APIアクセストークンの取得が「OAuth2.0」に準拠した方式へとアップグレードされた。

今回は、新しい認可方式を使った例として、LINE WORKSの掲示板へ投稿できる簡単なWebアプリを作ってみる。

# LINE WORKS API 2.0の認可方式について
LINE WORKS API2.0には、アクセストークン取得の方法が二種類ある。

- **User Account認証** 　←今回はこちら
    - LINE WORKSユーザーでログインをしてAccess Tokenを発行し、APIを利用する方法 (OAuth2.0準拠)。
    - スマホアプリやWebアプリ等に組み込む場合はこちらをつかう。
- Service Account認証
    - 仮想管理者アカウントを使用して認証を行い、Access Tokenを発行してAPIを利用する方法。
    - チャットボットやバッチ処理等でシステムがAPIを利用する場合はこちらを使う。
    - 使用例は別記事参照 https://qiita.com/mmclsntr/items/0c118f40ffe7f36cd4eb

User Account認証の認可プロセスはOAuth2.0 (Authorization Code Grant) に準拠しているため、OAuth2.0に対応しているライブラリやツールを活用してAPI連携実装ができるようになった。

今回は、このUser Account認証を使ったAPI利用の例として、Bubbleを活用してWebアプリを作成してみる。

# Bubbleとは
**[Bubble](https://bubble.io/)** はWebアプリ開発のノーコードツール。これを利用すればブラウザ上でWebアプリを手軽に作成することができる。

Bubbleは豊富なプラグインを持っているが、APIリクエストを送ることのできる「API Connector」プラグインは、OAuth2.0によるアクセストークン取得に対応している。

https://manual.bubble.io/account-and-marketplace/building-plugins/adding-api-connections#oauth2-user-agent-flow

これを活用してアクセストークン取得からAPIを使った掲示板投稿までを実装する。

なお、Bubbleは実装からテスト実行まではFreeプランで可能。今回はFreeプランの範囲でお話しする。

# 前提
- LINE WORKSテナントを作成済み、かつ、Developer Consoleの操作権限があること。
    - フリープラン以上 (有料プランである必要なし)
- Bubbleのアカウントを持っていること。
    - フリープラン

# 今回作るもの

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/0a813fa8-6f0f-2ac2-29a4-aa26fe32bdaa.png)

- 簡易な掲示板投稿アプリ。
- ユーザーがログインし、掲示板IDとタイトル・本文を入力して、指定した掲示板へ投稿する。
- 使うのはBubbleのみ。
- このアプリに必要なLINE WORKS APIの権限は、「ユーザー情報取得」と「掲示板投稿」を行うためのスコープのみ。


# 1. LINE WORKS API認証の準備
API2.0を使うために、まずはDeveloper Consoleで「アプリ」作成を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/5be1d3f8-9075-c064-b3c3-2c376a076316.png)

API2.0では、API利用のための認証情報・権限設定はこのアプリで設定でき、また、用途に分けて複数のアプリを作成できる。

https://developers.worksmobile.com/jp/reference/client-app?lang=ja

API利用のための以下の情報をアプリから取得する。

項目 | 取得方法
---|---
**Client ID** | アプリ作成時に自動生成
**Client Secret** | アプリ作成時に自動生成

次に、アクセストークンに与える権限を「**OAuth Scopes**」で指定する。今回は「ユーザー情報取得」と「掲示板投稿」をするため、 `board` と `user.read` scopeにチェックしておく。

API認証の準備としては一旦完了。実装過程で追加作業としてリダイレクトURLの設定がある。

# 2. Bubbleで実装
## 2.1. アプリ作成
Bubbleにログインし「New app」からアプリを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/c62aee60-5157-d8af-eb3e-d940ae2747d0.png)


## 2.2. 画面作成
アプリ作成後、画面を作っていく。

「Design」を表示し、以下のコンポーネントを画面に追加する。右辺が実際のElementsに設定する名前。

- ログインボタン = **Login Button**
- ユーザー情報グループ = **User Group**
    - Email表示 = **User email Text**
- 掲示板投稿グループ = **Board Group**
    - 掲示板ID入力欄 = **Board id Input**
    - 投稿タイトル入力欄 = **Board title Input**
    - 投稿本文入力欄　= **Board body Input**
    - 投稿ボタン = **Post Button**

どこに配置するかは自由。その他タイトルなどを加えて例えばこのようなレイアウトに配置できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/89ce09cf-a425-dc14-ba40-52503079c33c.png)

「User Group」と「Board Group」は、ログイン後に表示させるために、それぞれ「This element is visible on page load」のチェックをオフにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/0838801e-9c8b-6676-f662-b02a9e74a8aa.png)

画面作成は一旦完了。ボタンの挙動の設定や動的テキストの設定は後で行う。

## 2.3. API Connector設定 1 (アクセストークン取得の設定)
LINE WORKS APIのアクセストークン取得やAPIリクエストを行うための設定を行う。

「Plugins」へ移動し、まずは右上の「+Add Plugin」から「**API Connector**」を追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/7ac5438c-83fc-a7b6-5d27-af8411084774.png)

追加後、「API Connector」の「Add another API」でAPIを設定していく。

設定イメージ

![スクリーンショット 2022-04-15 18.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/a5c3cca6-5f43-60a6-e26f-43b8832475c2.png)

対応している認可方式はいくつかあるが、今回はLINE WORKS APIのUser Account認証で採用されているOAuth2.0を使うため、「Authentication」は「**OAuth2 User-Agent Flow**」を選択する。

参考 https://manual.bubble.io/account-and-marketplace/building-plugins/adding-api-connections#oauth2-user-agent-flow

次に、APIの認証情報を入れていく。

項目 | 入力内容 | 補足
---|---|---
App ID | Developer Consoleで取得したClient ID |
App Secret | Developer Consoleで取得したClient Secret |
Scope | user.read,board | ユーザー情報取得と掲示板投稿の権限
Authentication goes in the header | チェックをつける
Use a generic redirect URL　(...) | チェックをつける
Login dialog redirect | https://auth.worksmobile.com/oauth2/v2.0/authorize | 認可コード取得のURL
Access token endpoint | https://auth.worksmobile.com/oauth2/v2.0/token | アクセストークン取得のURL

最後に、ログインしたユーザーを識別するためのプロフィール情報取得についての項目も設定する。

プロフィール情報取得には、[ユーザー取得](https://developers.worksmobile.com/jp/reference/user-get?lang=ja)のAPIを使う。

項目 | 入力内容 
---|---
User Profile endpoint | https://www.worksapis.com/v1.0/users/me
User ID key path | userId 
User email key path | email

これでアクセストークン取得の設定は完了。

## 2.4. LINE WORKS Developer Consoleの追加設定 (リダイレクトURLの登録)
ここで、ログイン後のリダイレクト先となるURLを、先ほどLINE WORKS Developer Consoleで作成したAppに事前に登録しておく必要がある。

リダイレクトURLはApp Connectorの設定項目にあった「Use a generic redirect URL　(...)」の「...」の部分に記載されている。

Developer ConsoleでAppの設定を開き、「Redirect URL」にそのリダイレクトURLを追加しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/107cb41b-60f4-ce77-ccd9-bab13d6c05ee.png)


## 2.5. ログインアクションの設定
API Connectorでアクセストークン取得の設定をした後、ログインテストおよび設定したAPI設定の初期化を行う。

そのために、ログインボタンを押した際の挙動を設定する。

「Design」に戻り、「Login Button」の設定ポップアップにある「Start/Edit workflow」からログインボタン押下時の挙動 (Workflow) を設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/aa1a482a-a3c4-5b2e-0923-a3f1a5a60e4e.png)


1つ目に、ログインActionを追加する。

アクション一覧から「Action > Signup/login with a social network」を選択。
設定ポップアップの「OAuth provider」で、先ほど追加したAPIを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/ac1d6ee3-b838-840b-eb1c-a77d5e7d6246.png)

2つ目、3つ目に、ログイン後のActionを追加する。
ここにはページロード時には非表示としている「User Group」と「Board Group」を表示するActionをそれぞれ追加する。

アクション一覧から「Element Actions > All elements > Show」を選択。
設定ポップアップの「Element」で、Group名を選択する。

最終的にはこのよう３つのアクションが追加されている状態となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/da964283-d4c3-ddaa-ebea-7f08664b9768.png)

ボタンの設定は完了。

次に、「Design」に戻り、ログイン後にUser Group内の「User email Text」にログインユーザーのEmailが表示されるように設定する。

「User email Text」のテキスト設定で「>Insert dynamic data」から「Current User's email」を設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/57d5a546-a2e4-ed6b-e09f-e873b3f7fb16.png)

これでログインアクションの設定は完了。

## 2.6. ログインテスト & API設定の初期化
トップバー右の「Preview」からテストページを開き、ログインの挙動を確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/c7cebb2c-3d49-0aad-b49a-aa3db1d2cc50.png)


Loginボタンを押すとLINE WORKSのログインページへ飛ぶ。ID・パスワードを入力し、ログインする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/33b74b0f-3b76-1f80-6a9c-42421328521e.png)

以下のようなアラートが表示されると、ログインとアクセストークン取得が成功となり、API設定の初期化も完了する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/594730a4-3d71-bacb-a923-83fb835214d4.png)


画面上ではUser GroupやBoard Groupも表示され、ログインユーザーのEmailも表示される。

![スクリーンショット 2022-04-15 17.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/c47d74b9-da41-5e3c-7ed0-97777bae9bfd.png)

API設定の初期化後、API Callの設定ができるようになる。

## 2.7. API Connector設定 2 (API Callの設定)
「Plugins > App Connector」に戻り、API Callを設定する。すでに「API Call」という名前のcall設定があるため、右上の「expand」から表示を展開する。

今回は掲示板への投稿を行うため、[投稿の登録](https://developers.worksmobile.com/jp/reference/board-post-create?lang=ja)のAPIを使う。

設定イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/644b7d65-d526-5b54-172f-097c3b7fb6df.png)


ボタン押下時に実行するため、「Use as」は「Action」を選択する。

「URL」は
`https://www.worksapis.com/v1.0/boards/[boardId]/posts` 
を入れておくことで、掲示板のID `boardId` をパラメータとして利用できる。PrivateはOFFにする。

「Headers」には「Content-Type: application/json」を入れる。

「Body」には以下の内容を入れておき、投稿タイトル `title` と投稿本文 `body` はパラメータとして利用する。PrivateはOFFにする。

```json
{
  "title": "<title>",
  "body": "<body>",
  "enableComment": true,
  "mustReadDays": 0,
  "sendNotifications": true
}
```

API Callは事前にこの設定画面上で初期化を行う必要があり、「Initialize call」ボタンからAPIリクエストを実際に送る。そのリクエストのために、各パラメータには実際の値を入れておく。

投稿先となる掲示板については、事前にLINE WORKSで作成するかデフォルトのものを用意し、掲示板URLから「boardId」を取得しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/703e27bc-e11f-db78-985b-6b67f0fef716.png)

パラメータも含めて設定後「Initialize call」でリクエストを送り、初期化を行う。

リクエストが成功すると「Returned values - API Call」というモーダルが表示され、レスポンスボディのデータ構造を登録する。

これでAPI Callの設定は完了。

## 2.8. 掲示板投稿アクションの設定
投稿ボタンを押した際の挙動を設定する。

「Design」に戻り、「Post Button」の設定ポップアップにある「Start/Edit workflow」から投稿ボタン押下時の挙動 (Workflow) を設定する。

アクション一覧の「Plugins」に、先ほど追加したAPI Callが表示されるため、これを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/596dd534-50ac-c719-93f5-af3789c3d27d.png)

設定ポップアップで、それぞれのパラメータに入れる値を設定する。ここでは、画面上の各入力欄から値を取るため「> Insert dynamic data」で以下のように設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/ba405ea9-0402-22e3-6781-ed361276c42e.png)

これで投稿アクションの設定は完了。

## 2.9. 実行
これですべての設定が完了。Previewで再度テストページを表示し、動作をチェックする。

まずは、先ほどのログインテストと同じ操作でログインし、Board Groupを表示させる。

Board IDに掲示板のID (今回は「お知らせ」掲示板のID)、Titleに投稿タイトル、Bodyに投稿本文を入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/058727f5-1d85-d984-1ae4-f7efe1be4ef6.png)

投稿ボタンを押すとAPIリクエストが送られ、すべての設定に問題なければ、掲示板に投稿される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/f1e89814-b8fc-9dd1-deb9-50708d8b9374.png)


# 参考
https://developers.worksmobile.com/jp/reference/authorization-auth?lang=ja

https://qiita.com/nkmk1215/items/7b2a5aba763a973fa4bb

# まとめ
API2.0ではアクセストークン発行がOAuth2.0に準拠しているため、BubbleのようなOAuth2.0に対応しているツールを使うことでLINE WORKSとの連携アプリが簡単に実装できるようになった。

今回はLINE WORKS APIのみを利用した形であるが、ユースケースとして他のAPIも組み合わせてシステム間連携を実装することも多いはず。認可周りはもちろん、API自体も構造が整理されたため、LINE WORKSを活用した様々なアプリケーションが開発しやすくなったと感じる。