背景
とある事情で弊社が公開しているWebサービスのWeb APIをユーザー向けに公開することになった。
弊社のサービスではDBにCloudFirestoreを使用しており、CloudFirestoreにはREST APIの機能が備わっているため、それを利用することにした。
メリット・デメリット
まず初めに、自前でAPIを実装せずにFirestoreのREST APIを利用することのメリット・デメリットを整理しておく。
メリット
メリットは実装の手間を省けること。
各リソースに対してそれぞれAPIを実装する場合それなりの工数がかかるので、それを省けるのは大きなメリット。
デメリット
デメリットとしては、サービスがFirestoreに依存してしまうことが挙げられる。
例えばFirestoreからRDBに移行したいとなった場合でも、FirestoreのREST APIを使用しているユーザーがいる場合難しくなる。
また当然ながら自前実装よりもカスタマイズ性に欠け、データを取得した後にデータを加工して返したいケースなどに対応できない。
REST API利用手順
利用手順は以下の通り。
1. プロジェクトIDとAPIキーを準備しておく(firebaseコンソールで確認可能)
2. Firebase Authenticationユーザーを、メールアドレスとパスワードで登録しておく
ユーザー登録はFirebase Authentication API経由でも可能
3. Firebase AuthenticationのログインAPIにリクエストを投げる
// リクエストサンプル
// API_KEYには1で準備したAPIキーを指定する
curl 'https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=[API_KEY]' \
-H 'Content-Type: application/json' \
--data-binary '{"email":"[user@example.com]","password":"[PASSWORD]","returnSecureToken":true}'
4. ログインAPIのレスポンスにIDトークンが含まれるので控えておく
// レスポンスサンプル
// IDトークンなどの情報が返却される
{
"localId": "ZY1rJK0eYLg...",
"email": "[user@example.com]",
"displayName": "",
"idToken": "[ID_TOKEN]",
"registered": true,
"refreshToken": "[REFRESH_TOKEN]",
"expiresIn": "3600"
}
5. Firestore REST APIにリクエストを投げる
// サンプルリクエスト(ドキュメントの読み取り)
// PROJECT_IDは1で準備したIDを指定する
// COLLECTION、 DOCUMENT_IDはそれぞれ取得したいコレクション名、ドキュメントID
// ID_TOKENは4で取得したIDトークン
curl \
https://firestore.googleapis.com/v1/projects/[PROJECT_ID]/databases/(default)/documents/[COLLECTION]/[DOCUMENT_ID]/' \
--header 'Authorization: Bearer [ID_TOKEN]' \
--header 'Accept: application/json' \
--compressed
6. レスポンスが200で返ってきたらOK!
注意点
IDトークンの有効期限
IDトークンは有効期限が1時間となっており、期限切れになるとAPIにアクセスできなくなる。
その場合、再度ログインしてもらうか、リフレッシュトークンを使用してトークンをリフレッシュする必要がある。
自動でリフレッシュトークンを使用してトークンをリフレッシュするなどの仕組みを検討してもよさそう。
セキュリティルール
APIでFirestoreにアクセスする場合も、Firestoreのセキュリティルールが適用される。
(IDトークンによってユーザーが特定され、そのユーザーがアクセスできないデータの場合はエラーになる)
セキュリティルールが適切に設定されていない場合、他のユーザーのデータにまでアクセス可能になるといったことが起こり得るため、ルールは適切に設定しておくこと。
おわりに
今回はCloudFirestore REST APIを利用してみました。
記事の誤りなどございましたらご指摘をお願いします。