27
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Cloud Firestore REST API を使う

Posted at

背景

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"
}

ウェブ API キーはこれ
image.png

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"
    }
  ]
}

プロジェクトIDはこれ
image.png

ドキュメントはこんなかんじなので正しく取れている
image.png

面倒な点

  • 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つくらいだろうか?
アプリサーバを噛ませるのが無難な気がする。

  1. 定期的に token をリフレッシュする処理を実装する :thinking:
  2. ESP32(Arduino) から直で Firestore にアクセスするのではなく、 Cloud Firestore SDK を使える言語で動いているアプリサーバを1段噛ませて送る。
  3. Cloud Firestore SDK が Arduino などに対応するのを待つ :sweat:

MEMO

27
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?