我正在尝试在Windows 10上使用firebase functions:shell在本地运行的Firebase Cloud Function中使用Node.js v8.4.0上的Node.js v8.4.0上的Firebase Admin访问Firestore。
firebase -v 4.2.1
"dependencies": {
"firebase-admin": "^6.0.0",
"firebase-functions": "^2.0.5"
}
尝试通过我的应用程序代码使用firebase admin后,我尝试在https://github.com/firebase/functions-samples/blob/master/quickstarts/uppercase-firestore/functions/index.js中运行快速入门示例。
这是实际的代码运行:
'use strict';
// [START all]
// [START import]
// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');
// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp({})
// [END import]
// [START addMessage]
// Take the text parameter passed to this HTTP endpoint and insert it into the
// Realtime Database under the path /messages/:documentId/original
// [START addMessageTrigger]
exports.addMessage = functions.https.onRequest((req, res) => {
// [END addMessageTrigger]
// Grab the text parameter.
const original = req.query.text;
// [START adminSdkAdd]
// Push the new message into the Realtime Database using the Firebase Admin SDK.
return admin.firestore().collection('messages').add({original: original}).then((writeResult) => {
// Send back a message that we've succesfully written the message
return res.json({result: `Message with ID: ${writeResult.id} added.`});
});
// [END adminSdkAdd]
});
// [END addMessage]
// [START makeUppercase]
// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
// [START makeUppercaseTrigger]
exports.makeUppercase = functions.firestore.document('/messages/{documentId}')
.onCreate((snap, context) => {
// [END makeUppercaseTrigger]
// [START makeUppercaseBody]
// Grab the current value of what was written to the Realtime Database.
const original = snap.data().original;
console.log('Uppercasing', context.params.documentId, original);
const uppercase = original.toUpperCase();
// You must return a Promise when performing asynchronous tasks inside a Functions such as
// writing to the Firebase Realtime Database.
// Setting an 'uppercase' sibling in the Realtime Database returns a Promise.
return snap.ref.set({uppercase}, {merge: true});
// [END makeUppercaseBody]
});
// [END makeUppercase]
// [END all]
但是,我仍然收到权限拒绝错误。
这是我得到的输出:
firebase > makeUppercase({original:'alphabets'},{params:{documentId:'mydoc'}})
'Successfully invoked function.'
firebase > info: User function triggered, starting execution
info: Uppercasing mydoc alphabets
info: Function crashed
info: { Error: 7 PERMISSION_DENIED: Missing or insufficient permissions.
at Object.exports.createStatusError (C:\projects\myproject\functions\node_modules\grpc\src\common.js:87:15)
at Object.onReceiveStatus (C:\projects\myproject\functions\node_modules\grpc\src\client_interceptors.js:1188:28)
at InterceptingListener._callNext (C:\projects\myproject\functions\node_modules\grpc\src\client_interceptors.js:564:42)
at InterceptingListener.onReceiveStatus (C:\projects\myproject\functions\node_modules\grpc\src\client_interceptors.js:614:8)
at callback (C:\projects\myproject\functions\node_modules\grpc\src\client_interceptors.js:841:24)
code: 7,
metadata: Metadata { _internal_repr: {} },
details: 'Missing or insufficient permissions.' }
我的安全规则是完全开放的,但是并不能解决错误。
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write;
}
}
}
我还认为这可能是身份验证问题,因此我尝试了以下方法来初始化应用程序:
admin.initializeApp()
admin.initializeApp(functions.config().firebase);
var serviceAccount = require('path/to/serviceAccountKey.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});
最后一个具有我自己的凭证文件和项目配置。所有这些尝试仍然给我缺少权限的错误。
更新: 我将这些功能部署到了云中,它们似乎运行良好,但是在本地运行时,仍然出现错误:7权限被拒绝。
更新2:
按照@Doug Stevenson的建议,使用gcloud auth application-default login
设置应用程序默认凭据。未设置确保环境的变量GOOGLE_APPLICATION_CREDENTIALS。尝试上面的1,2和3以及下面的4中的代码,但没有成功。遇到相同的错误。
admin.initializeApp({
credential: admin.credential.applicationDefault(),
databaseURL: "https://myapp-redacted.firebaseio.com"
});
答案 0 :(得分:1)
我希望到目前为止,您已经解决了您的问题。同样的事情发生在我身上,我正在分享我的情况,希望对别人有帮助。
我们管理多个Firebase项目-产品,开发,演出等。
我们使用以下命令初始化admin sdk:
let serviceAccount = require("../serviceAccountKey.json");
const databaseUrl = functions.config().environment.databaseurl
const storageBucket = functions.config().environment.storagebucket
const isDev = "true" === functions.config().environment.dev
// if dev environment
if (isDev) {
serviceAccount = require("../serviceAccountKey-dev.json");
}
admin.initializeApp({
projectId: functions.config().environment.projectid,
credential: admin.credential.cert(serviceAccount),
databaseURL: databaseUrl,
storageBucket: storageBucket
});
您知道您需要怎么做
firebase functions:config:get > .runtimeconfig.json
为仿真工作。好吧,我的runtimeconfig包含错误的配置。我正在加载我的serviceAccountKey-dev,但是我试图访问另一个项目。第二个我修复了runtimeconfig-对我有用。
答案 1 :(得分:1)
最终,我只需要运行gcloud auth application-default login
来确保我使用正确的Google帐户登录。