#Cloud Functionsをクライアントから呼ぶと謎のエラーが…
firebaseエミュレーターを使って、cloud functionsやらfirestoreやらを起動してテスト中に
クライアント(reactアプリ)から、下記のコードでcloud functionsの処理を呼び出すとエラーが…
###クライアント側
export const functions = firebase.functions("asia-northeast1");
if (window.location.hostname === "localhost") {
functions.useFunctionsEmulator("http://localhost:5001");
}
const handleEntry = () => {
var onCall = functions.httpsCallable("entry");
try {
const result = await onCall({});
console.log(result);
} catch (e) {
console.log(e);
}
};
###サーバー側
const admin = require("firebase-admin");
const functions = require("firebase-functions");
const serviceAccount = require("./hogehoge.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://hogehoge.firebaseio.com",
});
const db = admin.firestore();
exports.entry = functions
.region("asia-northeast1")
.https.onCall( (data, context) => {
return {
result: true,
message: "OK",
};
});
##エラー内容
api.ts:54 POST https://fcmregistrations.googleapis.com/v1/projects/hogehoge/registrations 401
app.js:100 FirebaseError: Messaging: A problem occured while subscribing the user to FCM: Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project. (messaging/token-subscribe-failed).
メッセージングで認証???
Cloud Messagingなんて使ってまへんけど…
###結局原因はわからん…
#解決方法
原因がわからんのに解決て…って感じですが、とりあえず回避する方法がわかったので残しておきます。
正式な回避方法がわかる方がいらっしゃったら、是非コメント頂けたらと…。
###悪いのはこいつっぽい
*とhogehogeでマスクしてます
const config = {
apiKey: "***",
authDomain: "hogehoge.firebaseapp.com",
databaseURL: "https://hogehoge.firebaseio.com",
projectId: "hogehoge",
storageBucket: "hogehoge.appspot.com",
messagingSenderId: "***", /* こいつがあると上記の認証エラーが出るのでこいつをとりあえずコメントアウト */
appId: "***",
measurementId: "***",
};
messagingSenderIdがconfigに指定されているとダメのようです。
今回はこれは使ってないのでコメントアウトして逃げます
Cloud Messaging使ってる場合はどうするんだろうか…
謎を残しつつ退散