我有一个客户端应用程序,用angular4编写,与firebase服务器通信。目前我正在尝试将nodejs与firebase集成在一起,它也将与客户端应用程序进行通信。
Firebase< ---->客户端(Angular4)< ----> NodeJs(firebase-admin)< ---->火力
我已经设置了一个fire-admin配置:
var admin = require("firebase-admin");
var serviceAccount = require("./server/myfile.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://mydb.firebaseio.com"
});
并且能够检索这样的数据:
var db = admin.database();
var ref = db.ref("messages");
ref.once("value", function(snapshot) {
console.log(snapshot.val());
});
但是如何在NodeJS服务器中检查客户端应用中的用户是否已登录?我需要这个NodeJS服务器与客户端通信,并在必要时提供数据和文件。
答案 0 :(得分:2)
基本上我按照Firebase文档解决了一个问题:
如果您的Firebase客户端应用与自定义后端服务器通信, 您可能需要识别当前已登录的用户 服务器。为安全起见,请在成功登录后发送给用户 使用HTTPS向您的服务器添加ID令牌。然后,在服务器上验证 ID令牌的完整性和真实性,并从中检索uid 它。您可以使用以这种方式传输的uid来安全地识别 您服务器上当前登录的用户。
在我的Facebook登录Angular4 App:
loginFb() {
this.loading = true;
this.afAuth.auth.signInWithPopup(new firebase.auth.FacebookAuthProvider()).then(
(user) => {
console.log('loginFB');
console.log(user);
var token = this.afAuth.auth.currentUser.getToken().then(
(token) => console.debug(`******** Token: ${token}`)); <== TOKEN
this.af.object(`/users/${user.uid}`).update({
displayName: user.auth.displayName,
email: user.auth.email,
photoURL: user.auth.photoURL
});
this.router.navigate(['/']);
}).catch(
(err) => {
this.loading = false;
this.error = err;
});
}
我的NodeJS服务器:
var admin = require("firebase-admin");
var serviceAccount = require("./server/service-account.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://myapp.firebaseio.com"
});
...
//test method
router.get("/isAuth/:token", function (req, res) {
var token = req.params.token;
admin.auth().verifyIdToken(token)
.then(function(decodedToken) {
var uid = decodedToken.uid;
console.log(`Current User ID: ${uid}`);
}).catch(function(error) {
console.log("Error: " + error);
});
});
这是验证身份验证的方式。