我有一个使用firebase构建的Web应用程序.在我的网络应用程序中,我有google,firebase,twitter注册/登录功能.
现在我想将它与我的api.ai代理集成,并拥有一个无缝的帐户链接.因此,用户将使用移动设备上的googel Home/assistant应用程序连接到我的代理商.在这个阶段,我将拥有谷歌帐户ID,谷歌电子邮件,用户名.
如果用户已经在场,我可以发送我的代理所需的令牌.但如果用户是新用户,我想在我的firebase数据库中创建帐户.我无法手动在firebase中创建联合帐户(来自nodejs应用程序/云功能)!
我知道有可能创建一个电子邮件+虚拟密码帐户,但这不是我想要的.因为用户在尝试登录我的网络应用程序时注册了虚拟密码,所以会使用他们的谷歌登录功能.
如果我创建电子邮件和虚拟密码,流量不好,我将强制用户更改密码并在他们访问我的网络渠道时再次链接他们的Google帐户!
有CLI方法,我可以从文件中导入用户.如果有可能,有人可以帮助我如何在云功能中完成这项工作吗?
node.js firebase-authentication firebase-admin actions-on-google api-ai
我有一个项目,它使用firebase auth和firebaseUI来验证用户.我启用了Google,Facebook和电子邮件提供商.我需要的是远程注销或禁用某些用户.
我希望用户在这样做时从应用程序注销.我尝试在firebase控制台中禁用该用户,并使用firebase管理SDK(https://firebase.google.com/docs/auth/admin/manage-sessions)撤消刷新令牌.
我等了2天以上,仍然注意到用户已登录并可以访问firestore数据.
我也经历了尝试 Firebase在删除后仍然检索authData
谁能指出我做错了什么?
我目前正在尝试构建一个云函数来将我的 Firestore 数据导出到我的存储桶。
我在 Firebase DOC 上找到的关于如何执行此操作的唯一示例:
https://googleapis.dev/nodejs/firestore/latest/v1.FirestoreAdminClient.html#exportDocuments
例子
const firestore = require('@google-cloud/firestore');
const client = new firestore.v1.FirestoreAdminClient({
// optional auth parameters.
});
const formattedName = client.databasePath('[PROJECT]', '[DATABASE]');
client.exportDocuments({name: formattedName})
.then(responses => {
const response = responses[0];
// doThingsWith(response)
})
.catch(err => {
console.error(err);
});
Run Code Online (Sandbox Code Playgroud)
从那个例子来看,我似乎需要安装@google-cloud/firestore作为我的云功能的依赖项。
但是我想知道是否可以仅使用firebase-admin包来访问这些方法。
我已经想到了这一点,因为firebase-admin已经@google-cloud/firestore作为依赖项了。
> firebase-admin > package.json
"dependencies": {
"@firebase/database": "^0.4.7",
"@google-cloud/firestore": "^2.0.0", // <---------------------
"@google-cloud/storage": "^3.0.2",
"@types/node": "^8.0.53",
"dicer": "^0.3.0",
"jsonwebtoken": "8.1.0",
"node-forge": "0.7.4" …Run Code Online (Sandbox Code Playgroud) node.js firebase google-cloud-functions firebase-admin google-cloud-firestore
无论如何都要检查firebase-admin nodejs脚本中是否完成了所有firebase事务,并正确地从firebase断开连接并退出nodejs脚本?
目前,即使在所有事务完成之后,firebase-admin nodejs脚本也将继续运行.
在后端,通过firebase的管理SDK生成自定义令牌:
router.use('/get-token', (req, res) => {
var uid = "big-secret";
admin.auth().createCustomToken(uid)
.then(function(customToken) {
res.json({
instanceID: customToken
});
})
.catch(function(error) {
console.log("Error creating custom token:", error);
});
});
Run Code Online (Sandbox Code Playgroud)
然后客户端前端应用程序选择customToken,然后向后端发出请求以验证:
const fbPrivateKey = serviceAccount.private_key;
const key = new NodeRSA(fbPrivateKey).exportKey('pkcs8-public-pem');
router.get('/verifyIdToken', cors(), (req, res) => {
jwt.verify(req.headers.authorization.split('Bearer ')[1], key, { algorithms: ['RS256'] }, function(err, decoded) {
console.log('err', err);
console.log('decoded', decoded);
});
Run Code Online (Sandbox Code Playgroud)
这总是错误的消息: JsonWebTokenError: invalid signature
这需要签名吗?如果有人能解释这个或有任何指针?
更新:
当req.headers.authorization.split('Bearer ')[1]通过jwt.io运行时,表示签名无效,但随后我输入我的私钥(key)并进行验证.
我是否使方法调用不正确或将错误的参数传递给jwt.verify()?
我是Firebase的新功能和javascript语言.每次用户创建写入数据库时,我都会尝试添加一个函数.这是我的代码:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.addAccount = functions.auth.user().onCreate(event => {
const user = event.data; // The firebase user
const id = user.uid;
const displayName = user.displayName;
const photoURL = user.photoURL;
return admin.database().ref.child("/users/${id}/info/status").set("ok");} );
Run Code Online (Sandbox Code Playgroud)
我想要做的是每次用户注册我的应用程序时,函数都会写入数据库,状态为"OK".但我的代码不起作用.

我究竟做错了什么?
我已经使用Firebase云功能进行了一段时间的实验,今天我对我的index.json文件进行了一些小改动(在要设置的文档中添加了一个字段),在Firebase控制台上部署>功能>日志我已经得到了这个奇怪的错误:
Auth error:Error: Could not refresh access token.
Run Code Online (Sandbox Code Playgroud)
和:
Error: 16 UNAUTHENTICATED: Getting metadata from plugin failed with error: Could not refresh access token.
at new createStatusError (/user_code/node_modules/firebase-admin/node_modules/grpc/src/client.js:65:15)
at /user_code/node_modules/firebase-admin/node_modules/grpc/src/client.js:568:15
Run Code Online (Sandbox Code Playgroud)
这是我尝试但没有奏效的一系列事项:
我firebase deploy上次成功的最后一次是昨晚.我在linux上.
谢谢.
昨天,我所有的firebase函数都开始抛出以下警告:
存储在Firestore中的Date对象的行为将发生变化,您的应用程序可能会发生变化.要隐藏此警告并确保您的应用不会中断,您需要在调用任何其他Cloud Firestore方法之前将以下代码添加到您的应用中:
Run Code Online (Sandbox Code Playgroud)const firestore = new Firestore(); const settings = {/* your settings... */ timestampsInSnapshots: true}; firestore.settings(settings);通过此更改,存储在Cloud Firestore中的时间戳将作为Firebase Timestamp对象而不是系统Date对象读回.因此,您还需要更新期望日期的代码,而不是期望时间戳.例如:
Run Code Online (Sandbox Code Playgroud)// Old: const date = snapshot.get('created_at'); // New: const timestamp = snapshot.get('created_at'); const date = timestamp.toDate();启用新行为时,请审核Date的所有现有用法.在将来的版本中,行为将更改为新行为,因此如果您不按照这些步骤操作,您的应用程序可能会突然发生.
现在我想根据此警告正确初始化我的firestore.我正在使用打字稿.
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp(functions.config().firebase);
let fireStoreDB = fireStoreDB || admin.firestore()
Run Code Online (Sandbox Code Playgroud)
从admin返回的firestore()没有警告中描述的.settings()方法,也没有在构造函数中获取对象.(它获取一个App对象).所以我有两个问题:
如何初始化我的firestore来获取设置对象?
当我向文档插入日期或当我查询文档时,我还需要传递Firestore.Timestamp对象吗?或者我可以查询/插入正常的JS Date对象,它会自动转换吗?
谢谢.
编辑:
我设法使用以下方法为http函数解决它:
if (!fireStoreDB){
fireStoreDB = admin.firestore();
fireStoreDB.settings(settings);
}
Run Code Online (Sandbox Code Playgroud)
但它仍然发生在firestore触发器上.任何人都知道如何给管理员提供默认设置:
admin.initializeApp(functions.config().firebase);
Run Code Online (Sandbox Code Playgroud)
所以它不会发生在firestore触发器上?
timestamp firebase google-cloud-functions firebase-admin google-cloud-firestore
我将 firebase 用于 auth 和 db,并将 AWS lambda 用于云函数。
要将 firebase 添加到我的 JS 项目中,我initializeApp将 firebase 配置作为参数,如下所述:https : //firebase.google.com/docs/web/setup。
如此处所述:https : //firebase.google.com/docs/admin/setup,我还需要initializeApp在我的 lambda 函数中。
如下:
const admin = require('firebase-admin');
const serviceAccount = require('../path/to/service-account.json');
const firebaseAdmin = admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "dB_URL"
});
Run Code Online (Sandbox Code Playgroud)
凭据来自 firebase-admin 库,因此我无法将其添加到我的 web firebase 配置中。所以,我需要初始化两次。
但是,如果我这样做,服务器将抛出错误:
默认 Firebase 应用已存在。这意味着您多次调用 initializeApp() 而不提供应用程序名称作为第二个参数。在大多数情况下,您只需要调用 initializeApp() 一次。但如果您确实想初始化多个应用程序,请将第二个参数传递给 initializeApp() 以给每个应用程序一个唯一的名称。
我在这里错过了什么吗?最佳做法是什么?我糊涂了。
之前有人遇到过同样的问题:使用 Firebase SDK 和 Netlify Lambda 函数
对该用户有用的是使用此处记录的 REST API:https : //firebase.google.com/docs/projects/api/workflow_set-up-and-manage-project …
我正在构建一个 Express.js 应用,使用 Firebase Admin SDK 实现 ID 令牌验证和 Cloud Firestore 访问等多项功能。在我的主 app.js 文件中,我将应用程序初始化为:
const admin = require('firebase-admin')
const serviceAccount = require('../config/account-credentials.json')
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://databaseurl.firebaseio.com'
})
Run Code Online (Sandbox Code Playgroud)
在另一个文件中,我所做的就是导入:
const admin = require('firebase-admin')
Run Code Online (Sandbox Code Playgroud)
我可以admin.auth().verifyIdToken很好地调用和验证 ID 令牌。但是,当我致电时app.database(),它抱怨该应用程序从未初始化。再次初始化应用程序会产生一个新错误:
默认 Firebase 应用已存在。这意味着您多次调用了initializeApp(),而没有提供应用程序名称作为第二个参数。在大多数情况下,您只需要调用一次initializeApp()。但如果您确实想初始化多个应用程序,请将第二个参数传递给initializeApp(),以便为每个应用程序指定一个唯一的名称。
我是否需要创建多个具有不同名称的应用程序才能正常工作?或者我如何在整个项目中使用一个应用程序。
firebase-admin ×10
firebase ×8
node.js ×6
api-ai ×1
aws-lambda ×1
javascript ×1
jwt ×1
timestamp ×1