4
3

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.

Firebase Cloud FunctionsでFireStore書き込みエラー

Last updated at Posted at 2020-07-16

#権限エラーが出た

久しぶりにFirbaseで別プロジェクトを作って、
firebase serveでローカルテスト中に
CloudFunctionsからFireStoreに書き込みにいったら下記のエラーが…:cry:

Error: 7 PERMISSION_DENIED: Missing or insufficient permissions.

読むのは読めるので、なんか書き込みの権限が無いのかなと
firestoreのルールを見てみる

firestore.rules
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

cloud functionsから呼ぶときってauth関係なくいけるんじゃなかったっけ…

index.js
const admin = require('firebase-admin');
admin.initializeApp();

admin使ってるしなんも問題無さそう?:hushed:
ローカルがおかしいのかも?1回デプロイして試してみる
firebase deploy:muscle:

###deployしたら書き込めた

ローカルだけの問題ですね…
ぐーぐる先生おたすけ:innocent:

#解決方法

一応ローカルだけの問題ということで、解決方法が二つありましたので
とりあえず両方記載しておきます:yum:

##その1 serviceAccountを読み込む

そういえば忘れてたって感じなんですが、Firebaseコンソールのユーザーと権限の
サービスアカウントのタブにFirebaseAdminSDKというのがあって
そこで秘密鍵を生成するんでした…:kissing:

そこから生成したjsonファイルをダウンロードして
functionsフォルダの直下に置きます。

そして、functionsのindex.jsへコンソールに表示されている
AdminSDK構成スニペットを貼り付けます

パスの部分をさっきダウンロードしたjsonに置き換える(直下に置いたので./)
ファイル名はそのままだと長いので変えても大丈夫です。

index.js
const admin = require("firebase-admin");
const serviceAccount = require("./hogehoge.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://コンソールに出てる自分のやつ.firebaseio.com"
});

これを入れると、ローカルからも無事firestoreに書き込みが出来るようになりました:grinning:

##その2 GOOGLE_APPLICATION_CREDENTIALSを変える

GOOGLE_APPLICATION_CREDENTIALSというのを設定するというのを見つけたので
今の自分のを確認してみたら、前のプロジェクトで使ってたものになっていました。

なので、その1の設定をしていない場合、
デフォルトでここのjsonを参照しにいくようで、別プロジェクトのjsonが設定されており
その状態で別プロジェクトのfirestoreに書き込みに行こうとして、そんな越権できないよっていうエラーだったのかも?

上記を設定する方法はこれ↓

command
set GOOGLE_APPLICATION_CREDENTIALS={先ほどのダウンロードしたjsonのパス}

これを設定すると、index.jsは

index.js
const admin = require('firebase-admin');
admin.initializeApp();

↑のままでもローカルからfirestoreに書き込みが出来るようになります。

##まとめ

ローカルで色んなプロジェクト使ってる人はいちいち書き換えるのめんどいのでその1
ずっと同じプロジェクト使ってるぜって人はその2でも良い?

って感じで:hand_splayed:

4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?