使用NodeJS进行Firebase身份验证:获取发出请求的客户端的UID

时间:2019-04-12 20:05:59

标签: node.js firebase firebase-authentication firebase-admin

我使用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而不显式发送它以避免安全问题?

2 个答案:

答案 0 :(得分:1)

我已经设法通过Firebase Admin SDK来做到这一点。

this指南中所述,您需要:

  1. 为您的服务帐户生成私钥

    • 在Firebase控制台中,打开“设置”>“服务帐户”。
    • 点击生成新私钥,然后通过点击生成私钥进行确认。
    • 安全地存储包含密钥的JSON文件。
  2. 设置环境变量

添加到您的.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