#権限エラーが出た
久しぶりにFirbaseで別プロジェクトを作って、
firebase serveでローカルテスト中に
CloudFunctionsからFireStoreに書き込みにいったら下記のエラーが…
Error: 7 PERMISSION_DENIED: Missing or insufficient permissions.
読むのは読めるので、なんか書き込みの権限が無いのかなと
firestoreのルールを見てみる
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
cloud functionsから呼ぶときってauth関係なくいけるんじゃなかったっけ…
const admin = require('firebase-admin');
admin.initializeApp();
admin使ってるしなんも問題無さそう?
ローカルがおかしいのかも?1回デプロイして試してみる
firebase deploy
###deployしたら書き込めた
ローカルだけの問題ですね…
ぐーぐる先生おたすけ
#解決方法
一応ローカルだけの問題ということで、解決方法が二つありましたので
とりあえず両方記載しておきます
##その1 serviceAccountを読み込む
そういえば忘れてたって感じなんですが、Firebaseコンソールのユーザーと権限の
サービスアカウントのタブにFirebaseAdminSDKというのがあって
そこで秘密鍵を生成するんでした…
そこから生成したjsonファイルをダウンロードして
functionsフォルダの直下に置きます。
そして、functionsのindex.jsへコンソールに表示されている
AdminSDK構成スニペットを貼り付けます
パスの部分をさっきダウンロードしたjsonに置き換える(直下に置いたので./)
ファイル名はそのままだと長いので変えても大丈夫です。
const admin = require("firebase-admin");
const serviceAccount = require("./hogehoge.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://コンソールに出てる自分のやつ.firebaseio.com"
});
これを入れると、ローカルからも無事firestoreに書き込みが出来るようになりました
##その2 GOOGLE_APPLICATION_CREDENTIALSを変える
GOOGLE_APPLICATION_CREDENTIALSというのを設定するというのを見つけたので
今の自分のを確認してみたら、前のプロジェクトで使ってたものになっていました。
なので、その1の設定をしていない場合、
デフォルトでここのjsonを参照しにいくようで、別プロジェクトのjsonが設定されており
その状態で別プロジェクトのfirestoreに書き込みに行こうとして、そんな越権できないよっていうエラーだったのかも?
上記を設定する方法はこれ↓
set GOOGLE_APPLICATION_CREDENTIALS={先ほどのダウンロードしたjsonのパス}
これを設定すると、index.jsは
const admin = require('firebase-admin');
admin.initializeApp();
↑のままでもローカルからfirestoreに書き込みが出来るようになります。
##まとめ
ローカルで色んなプロジェクト使ってる人はいちいち書き換えるのめんどいのでその1
ずっと同じプロジェクト使ってるぜって人はその2でも良い?
って感じで