背景
ESP32(Arduino) から Firestore にデータを貯めたいが、 SDK が使えない環境からだとどうやる?
↓
Cloud Firestore REST API だけで済ませられないか?
↓
日本語記事少ないな、試したことをまとめておくか
結論
- トークン管理が簡単にできるフレームワークを使えないとめんどくさそう。
- ESP32 からは実際に試していないが、単純に curl で POST しているだけなので、 ESP32 でも同じことはできるはず。
前提条件
- Firebase プロジェクトを作成済み
手順
i) Firebase プロジェクトのウェブ API キーを使ってプロジェクトに User 作成 & idToken を取得
Userを作成&idToken取得
$ curl -X POST -d '{"email":"user@example.com", "password":"passw0rd"}' 'https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=[API Key]'
{
"kind": "identitytoolkit#SignupNewUserResponse",
"idToken": "{長い文字列}",
"refreshToken": "{長い文字列}",
"expiresIn": "3600",
"localId": "eVysdexYEQPTsLkEDofGlwkVK463"
}
ii) idToken
を使って REST API アクセス(以下、例として document 取得)
document取得
$ curl 'https://firestore.googleapis.com/v1/projects/{プロジェクトID}/databases/(default)/documents/test' -H "Authorization: Bearer {idToken}"
{
"documents": [
{
"name": "projects/{プロジェクトID}/databases/(default)/documents/test/hoge",
"fields": {
"fuga": {
"stringValue": "123"
}
},
"createTime": "2020-01-27T06:32:39.778017Z",
"updateTime": "2020-01-27T06:32:39.778017Z"
}
]
}
面倒な点
- 3600 秒で idToken の expire が発生するので、リフレッシュする必要がある。
(idToken が expire しても refresh_token は生きているので、 idToken の更新はできる。)
tokenをrefresh
$ curl -X POST -d 'grant_type=refresh_token&refresh_token={refresh_token}' 'https://securetoken.googleapis.com/v1/token?key={API Key}'
{
"access_token": "{長い文字列}",
"expires_in": "3600",
"token_type": "Bearer",
"refresh_token": "{refresh_token}",
"id_token": "{新しいidToken}",
"project_id": "***********"
}
対策案
以下3つくらいだろうか?
アプリサーバを噛ませるのが無難な気がする。
- 定期的に token をリフレッシュする処理を実装する
- ESP32(Arduino) から直で Firestore にアクセスするのではなく、 Cloud Firestore SDK を使える言語で動いているアプリサーバを1段噛ませて送る。
- Cloud Firestore SDK が Arduino などに対応するのを待つ
MEMO
- Firebase Realtime Database は、一度 Secret を生成してしまえばずっと使い続ける事ができた。
https://github.com/FirebaseExtended/firebase-arduino/issues/326#issuecomment-389023811