みなさん、こんにちは!今回は、Bubble の Data API についてです!
Bubble の Data API とは、外部システムが Bubble アプリのデータベースにアクセスするための方法を提供してくれる機能です。Data API を利用すると、様々な外部サービスと Bubble アプリを連携させたりして、アプリの機能を更に拡張させるといったことが可能になります。
しかし、Data API は便利な一方、使用する際の認証方式や公開設定には注意が必要です。適切でない場合は、意図せぬセキュリティリスクを引き起こす可能性があります。安全に使用するためには、Data APIのセキュリティ原則をしっかりと理解し、適切に設定することが大切です。
この記事では、特に認証方法やプライバシールールに焦点を当てて、Data API の安全な使用方法を探っていきたいと思います。
なお、本記事では接続の確認に Postman を使用しています。
1. Data API のアクティブ化
※ 前提条件として Data API の利用には有料プランへの加入が必要です。設定項目の操作は Free プランでも可能ですが、実際のAPI 呼び出しについては、有料プランでない場合「Unauthorized」として処理されますのでご注意ください。
Data API を開始するには、Settings > API > Public API endpoints > Enable Data API にあるチェックボックスをオンに設定し、接続を実行する Data type にチェックを入れます。
Data API root URL に Data type 名を加えると、接続するためのエンドポイントとなります。 上図の例では Pagenation という名前の Data type にチェックを入れているので、エンドポイントは「https://SAMPLEAPP.bubbleapps.io/version-test/api/1.1/obj/pagenation」となります。
もし、クエリストリングを使用してトークンを指定したい場合は、先のエンドポイントに「?api_token=発行されたトークン」を追加することでも指定することができます。
また、Data API を有効化したタイミングで、対象の Data type に更新(Modify via API)、削除(Delete via API)、作成(Create via API)に関するプライバシールールの設定項目が追加されます。
プライバシールールで設定した権限を Data API で実際に適用するには、認証方法でユーザーとしての認証を使用することで適用されます。では、次項から認証方法について詳しく見ていきたいと思います。
2. 認証方法
Data API を使用する場合の認証方法には、以下の3種類があります。
- 認証無し
- 管理者として
- ユーザーとして
各項目の設定方法は、以下のように実装していきます。
2.1. 認証無し
認証無しでデータ操作を行いたい場合は、プライバシールールの Everyone else (default permissions) に対して、Data API の必要な権限を付与します。
ただし、認証無しの設定にはセキュリティリスクが伴うことに注意してください。エンドポイントのURLは公表していないつもりでも、例えば Meta 情報や Swagger ファイルを確認することで、エンドポイントについて誰でも知ることができます。
下の図は Postman で認証無しの方法でデータを取得したサンプルです。Everyone else に権限を付与することで取得だけでなく、データ更新や削除なども実行することが誰でもできるようになります。
2.2. 管理者として
管理者として認証を行うには、Settings > API > API Tokens で「Generate a new API token」のボタンをクリックしてトークンを生成します。
ここでいう管理者とは、原則としてアプリの管理者がバブル エディターで取得するのと同じ権限が付与されるということを意味します。管理者の場合はプライバシールールは適用されません。データベース内で検索、表示、作成、編集、削除できる内容に制限がないことに注意してください。
下図は Postman の Authorization に「Bearer Token」を指定して、Bubble エディタで発行した管理者用のトークンを使用した認証のサンプルです。
管理者として発行したトークンは厳重に管理するようにしましょう。
2.3. ユーザーとして
ユーザーとして認証を行うには、Backend workflow で通常のログインと同じ方法を使ってトークンを取得します。具体的には、下図のように Backend workflow で「Log the user in」アクションを実行する API workflow を実装します。ここでは API workflow 名を「generate-api-token」としました。
なお、Backend workflow を実装するには Settings > API > Public API endpoints > Enable Workflow API and backend workflows の設定をオンにしておく必要があります。
ユーザー認証の為の API workflow(ここでは「generate-api-token」) が作成できたら、トークンが発行されるか Postman を使って接続してみます。
接続する際には「generate-api-token」の Key であるログイン用の「email」と「pass」を Body に忘れずに設定しておきます。
レスポンスで「token」を取得できることが確認できました。次に、発行されたユーザー認証のトークンを使用して、Data API に接続してみます。
上図では、ユーザー認証を使用してデータ取得が実行されたことが確認できます。認証したユーザーは、下図のようなプライバシールールが適用されるユーザーとなっています。
プライバシールールは「no」と「Created Date」の Data field に対して View 権限を付与していますので、Data API で取得された結果もフィルタリングされていることが分かります。
例えば、このユーザー権限では更新(Modify via API)の権限を持っていませんので、下図のように Data API で更新を実行しても「Unauthorized」として処理されることになります。
また、ユーザー認証で使用したトークンの取り消しを行いたい場合は、下図のように「Log out other user's sessions」と「Log the user out」を実装した API を作成します。2つのログアウトを設定することで、現在のセッションと他のセッションの両方を完全に取り消すことができるようになります。
レスポンスで「success」を受け取れば、トークン取り消しの成功です。
取り消したトークンを使用して、データ取得を行っても「Unauthorized」を受け取るようになりました。
ユーザー認証を行うことで Data API を利用する際に、より安全なセキュリティレベルを適用することができますね!
4. おまけ Data API GET メソッド
セキュリティとはあまり関係ありませんが、Data API ではデータを取得する際にページ分割(Pagination)や Do a search for のように並び替え(Sorting)を指定することができますので、簡単にご紹介しておきます。
4.1. Pagination
Bubble の Data API ではデフォルトで結果を100レコードのページに分割しますが、パラメータを追加することで分割を操作することができるようになります。
URLのパラメータに「cursor(リストの開始位置)」と「limit(取得したい結果数)」を追加します。
今回のサンプルでいうと「https://SAMPLEAPP.bubbleapps.io/version-test/api/1.1/obj/pagenation?&cursor=3&limit=2」(3行目から2件のデータを取得するという意味)といった具合です。また、現在のページの最後のアイテムの後に存在する残りのアイテムの数を表す「remaining」も併せて提供されます。
4.2. Sorting
並び替えも同様に「Sort_field(並び替えるフィールド名)」と「Descending(降順を true/false で指定)」のパラメータを追加することで指定できます。更にフィールドを追加したい場合は「additional_sort_fields」パラメータを配列で指定します。
5. まとめ
今回は、Data API におけるセキュリティの基本として、認証無し、管理者認証、ユーザー認証の3つの方法をご紹介しました。認証無しの設定では、セキュリティリスクが高くなる可能性がありますが、管理者認証では、プライバシールールが適用されず、全てのデータ操作が可能になります。これに対し、ユーザーとしての認証では、より制限されたアクセスとデータ操作が可能となり、セキュリティが強化されます。
Data API を活用する際は、これらの認証方法とプライバシールールを適切に組み合わせることで、セキュリティを確保しつつ、アプリケーションの機能を拡張することが重要になりそうですね!アプリ開発を進める際は、各プロジェクトのニーズに応じて、適切なセキュリティ設定を選択していきましょう。
それでは、ここまでお読みいただきありがとうございました。では、次回もどうぞお楽しみに~!