我使用NodeJS与Firebase的Realtime Database通信。
定义了规则,因此只有管理员帐户可以读写:
{
"rules": {
".read": "auth.uid === 'ADMIN_UID'",
".write": "auth.uid === 'ADMIN_UID'"
}
}
当NodeJS Express服务器初始化时,我使用管理员凭据登录。
在Web应用程序上,我使用Firebase的“使用Facebook登录”选项:
const provider = new firebase.auth.FacebookAuthProvider();
provider.setCustomParameters({
display: "popup",
});
firebase
.auth()
.signInWithPopup(provider)
一切正常。
现在,我正在尝试从Web应用程序中提取发出请求的用户的用户ID(uid)。当我运行以下行时:
const user = firebase.auth().currentUser;
我得到的是管理员用户,而不是发出请求的用户。我猜这是预期的。我的问题是如何获取UserId而不显式发送它以避免安全问题?
答案 0 :(得分:1)
我已经设法通过Firebase Admin SDK来做到这一点。
如this指南中所述,您需要:
为您的服务帐户生成私钥
设置环境变量
添加到您的.bashrc或.zshrc:
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
-在NodeJS中初始化SDK:
admin.initializeApp({
credential: admin.credential.applicationDefault(),
databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});
在您的客户端中,将JWT令牌发送到标头中:
const token = await firebase.auth().currentUser.getIdToken()
fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: token
},
body: ...
});
在您的服务器中解密令牌并获取UID:
return admin
.auth()
.verifyIdToken(token)
.then(function(decodedToken) {
var uid = decodedToken.uid;
console.log("uid ->", uid);
return uid;
})
.catch(function(error) {
console.log("error ->", error);
// Handle error
});
就是这样。显然,通过您自己的NodeJS域使用Firebase被称为“使用自定义后端”。这意味着它们的默认用法是没有NodeJS或其他后端中间人。
答案 1 :(得分:0)
通常,在firebase中,您可以包括访问正在发出的请求的context
并且userId可用。
类似以下内容:
context.params.userId