我正在尝试使用firebase serve --only functions
在本地运行云函数。如果我在这里通过firebase控制台创建服务帐户时手动指定下载的key.json:https://console.firebase.google.com/project/project-id/settings/serviceaccounts/adminsdk,它就能工作。然后做export GOOGLE_APPLICATION_CREDENTIALS=key.json
。我为什么要这么做?firebase或gcloud不应该正确地处理这个问题吗?我以为在functions.config().firebase
的证件是ApplicationDefault。https://developers.google.com/identity/protocols/application-default-credentials。根据这一点,像上面这样的env变量首先被选中,所以如果有,它就能工作。但#2不应该证明我是正确的吗?
我有应用程序引擎的gcloud,所以我已经完成了gcloud init
和gcloud auth application-default login
。
我用index.js初始化我的应用程序
const admin = require('firebase-admin');
const functions = require('firebase-functions');
admin.initializeApp(functions.config().firebase);
firebase serve --only functions
很好地部署了这些函数。但是,当我执行一个使用此代码admin.auth().getUser(uid)...
的代码时,它会出现以下错误:
错误:发生了内部错误。原始服务器响应:“{”错误“:{”错误“:[{”域“:”usageLimits“,”原因“:”accessNotConfigured“,”消息“:”访问未配置“。API以前没有在项目7640.50中使用,或者是禁用的。通过访问https://console.developers.google.com/apis/api/identitytoolkit.googleapis.com/overview?project=7640...50来启用它,然后重试。如果您最近启用了这个API,请等待操作传播到我们的系统并重试.“,”,"extendedHelp":"https://console.developers.google.com/apis/api/identitytoolkit.googleapis.com/overview?project=7640...50"}],“代码”:403,“消息”:“访问未配置”。API以前没有在项目7640.50中使用,或者是禁用的。通过访问https://console.developers.google.com/apis/api/identitytoolkit.googleapis.com/overview?project=7640...50来启用它,然后重试。如果最近启用了此API,请等待操作传播到我们的系统并重试几分钟。
项目编号不对应于我的firebase项目或console.cloud.google.com中的项目id/编号
如果没有gcloud,我会得到这个错误。
错误:通过“凭据”属性提供给initializeApp()的凭据实现无法获取有效的Google OAuth2访问令牌,并出现以下错误:“错误获取访问令牌: invalid_grant (令牌已过期或撤消。)”。有两个可能的原因:(1)您的服务器时间没有正确同步,或者(2)您的证书密钥文件已被撤销。要解决(1),请重新同步服务器上的时间。要解决(2),请确保您的密钥文件的密钥ID仍然存在于https://console.firebase.google.com/iam-admin/serviceaccounts/project中。如果没有,在/settings/serviceaccounts/adminsdk生成一个新的密钥文件
类似于https://github.com/urish/firebase-server/issues/81
我已经生成了一个密钥文件。我已经尝试过删除现有的,并创建新的,唯一的解决方案是下载生成的密钥并手动导出环境变量
还有别的办法吗?
发布于 2017-11-27 10:24:57
从技术上讲,是的,但您可以构建代码,以便在本地测试时使用本地密钥,在服务器上运行时使用服务密钥。
为此,我将env var FB_SERVICE_ACCOUNT_KEY
设置为json秘密的路径。当未设置它(即部署在Firebase函数中)时,将使用标准init。
下面是一个基本的例子
if(process.env.FB_SERVICE_ACCOUNT_KEY){
var serviceAccount = require(process.env.FB_SERVICE_ACCOUNT_KEY);
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: `https://${process.env.GCLOUD_PROJECT}.firebaseio.com`
});
}
else{
admin.initializeApp(functions.config().firebase);
}
https://stackoverflow.com/questions/45065826
复制相似问题