はじめに
今回は以下のエラーを解決します。
詳細は後述しますが、Firebase の設定の問題でありつつ、環境変数の設定の問題でした。
やろうとしていたこと
フロントエンドからバックエンド(Vercel Functions)に認証トークンを送り、それをバックエンドで検証しようとしていました。
流れとしては以下のような感じです。
- フロントエンドで認証トークンを取得
- fetch の headers の Authorization に認証トークンをのせて送る
- バックエンドで受け取った認証トークンを検証
ローカルでの確認方法は、verce dev
コマンドを使用しています。(Vercel Functions 使用のため)
環境
- フロントエンド:Next.js、TypeScript
- バックエンド:Vercel Functions(Go)
- 認証周り:FirebaseAuthentication
- ローカルで FirebaseEmulator を使って動作確認中
先に結論
環境変数を.env
に全て定義するか、環境変数 FIREBASE_AUTH_EMULATOR_HOST
を Vercel でデプロイします!!!!
.env
でローカルでの環境変数を設定する場合
.env
にFIREBASE_AUTH_EMULATOR_HOST
の環境変数を設定します!
環境変数を Vercel に設定しているもので設定する場合
ローカルでの確認の場合も環境変数のデプロイをしないと認識されません。
FIREBASE_AUTH_EMULATOR_HOST
の環境変数を追加したら一旦デプロイし直しましょう。
今回は前の PR の Preview デプロイをデプロイし直して解決しました。
デプロイし直すのはなんでも OK です!
起きていた問題
フロントエンドから受け取った認証トークンを検証すると、以下のエラーが出て認証が失敗していました。
認証トークンの取得はログイン済ユーザーのトークンを FirebaseAuthentication から取得していました。
バックエンド側(Go)も FirebaseSDK を使って検証をしていました。
特に問題がないはずです。
エラーに示されたリンクをみても手元でやっている内容でした。
解決する
調べていると、どうも Emulator での動作では kid がないのが通常らしい、ということがわかります。
そのため、FIREBASE_AUTH_EMULATOR_HOST
を環境変数に定義していることで検証が通せるとのことでした。
- https://github.com/firebase/firebase-tools/issues/2764
- https://github.com/firebase/firebase-tools/issues/5821
ということで Vercel に環境変数を追加し、ローカルでも.env.local
に入れて「さあこれでよし」、と思ったものの同じエラーが出続けました。
再起動してみても変わりません。
ここで解決した方法は Vercel のデプロイのし直しです!
そうです。
Vercel でデプロイし直していなかったことによって、環境変数を認識できない状態になっていました。
これでやっと認証の検証が成功するようになり、無事解決しました。
これまでvercel dev
ではなくnext dev
でローカルでの確認をしていたので、起きた問題でした。
こちらの記事でも書いていますが、.env
を使えばデプロイし直さなくても問題なさそうです。
まとめ
Vercel の環境変数を追加した場合はデプロイし直しが必要、ということは認識していたのですが、
ローカルで.env.local
にいれて確認中という場合は.env.local
にあれば良いと思っていました。
デプロイし直すか、.env
を使うことで解決しました!
.env
の話はこちらの記事でも書いているので、もしよければご覧ください!