2022-01-01

google-cloud/firestore を使って Cloud Firestore REST API を呼び出す

NextAuth を使ってログイン処理を行う時に firestore の REST API を呼び出して firestore にログイン情報を登録させる方法を試してみた。

Cloud Firestore REST API の公式ドキュメントは以下。
Cloud Firestore REST API を使用する

今回は公式にも記載のあった@google-cloud/firestore という Node.js 用のクライアントライブラリを使用した。

まずはライブラリをインストールし、 Quickstart の手順に従い以下の流れで準備を行う。
Quickstart

① プロジェクトの選択
②Cloud Firestore API の有効化
③ サービスアカウント作成、キーの登録とダウンロード

とりあえず最小構成でいいので API を試してみる。

hoge.js

const Firestore = require('@google-cloud/firestore')
const firestore = new Firestore()

const document = firestore.doc(`users/hoge`)
document.set({
  email: 'hoge@gmail.com',
})

ダウンロードしたキーファイルのパスを環境変数に指定して実行。

$ GOOGLE_APPLICATION_CREDENTIALS=***.json node hoge.js

すると無事 firestore への保存が成功した。

次に NextAuth のログイン処理時に API を叩くよう実装してみる。
参考:Callbacks
ほぼコピペだがこんな感じ。

import NextAuth from 'next-auth'
import GithubProvider from 'next-auth/providers/github'
import { Firestore } from '@google-cloud/firestore'

const firestore = new Firestore()

export default NextAuth({
  providers: [
    GithubProvider({
      clientId: process.env.GITHUB_ID,
      clientSecret: process.env.GITHUB_SECRET,
    }),
  ],
  pages: {
    signIn: '/signin',
  },
  callbacks: {
    async signIn({ user, account, profile, email, credentials }) {
      const document = firestore.doc(`users/${user.id}`)
      await document.set({
        email: email,
      })
      return true
    },
  },
})

これで早速ログイン処理を実行してみると、、エラーが返ってきた。

デバッグしてみると、 signIn()の引数のemailにはユーザーのメールアドレスが入ってるものかと勝手に思いこんでいたが、実は bool が入っていた。

以下のように修正することで無事メアドも取れるようになった。

async signIn({ user, account, profile, email, credentials }) {
    const document = firestore.doc(`users/${user.id}`)
    await document.set({
        email: user.email,
    })
    return true
},