首页  >  问答  >  正文

Nodejs + firebase:如何检查用户是否经过服务器端身份验证

用户使用 firebase sdk 在客户端进行身份验证。

在服务器端,有nodejs,也安装了sdk。该服务器代码是有效的,因为我可以使用数据库:

var firebase = require("firebase/compat/app");
require("firebase/compat/database");
require("firebase/compat/auth");

const firebaseConfig = {
  apiKey: "Axxx4",
  authDomain: "movtxxxom",
  projectId: "moxxx2",
  storageBucket: "movxxom",
  messagingSenderId: "14xx9",
  appId: "1:1xxxea13c",
  measurementId: "GxxFL",
  databaseURL: "httpxxx/",
};

// Initialize Firebase
firebase.initializeApp(firebaseConfig);

此代码有效。

这是一个(fastify)路线,我想在其中获取用户信息:

fastify.get("/login-success", async (request, reply) => {
 // Return View

 const user = firebase.auth().currentUser;
 console.log(user);
 return reply.view("/templates/login-success.ejs", {
   text: "Log in success",
 });
});

用户变量始终为空。

如何处理这个问题的正确方法?

更一般地如何处理这种情况?

P粉493313067P粉493313067428 天前540

全部回复(2)我来回复

  • P粉360266095

    P粉3602660952023-09-09 13:15:25

    aannabeengineer 是对的。这是一个概念证明(在用户身份验证和检索信息后必须对服务器端代码进行调整)。

    服务器:

    fastify.post("/authcheck", async (request, reply) => {
      try {
        const idToken = request.body.idToken;
        console.log(idToken);
        const decodedToken = await firebase.auth().verifyIdToken(idToken);
        const uid = decodedToken.uid;
    
        // Get user data from Firebase
        const user = await firebase.auth().getUser(uid);
        console.log(user.displayName);
        return user; // DO SOMETHING ELSE
      } catch (error) {
        console.error("Error verifying ID token:", error);
        reply.code(401).send({ error: "Unauthorized access" });
      }
    });

    前端:

    async function sendTokenToServer() {
                try {
                  const idToken = await firebase
                    .auth()
                    .currentUser.getIdToken(/* forceRefresh */ true);
    
                  // Send token to your backend via HTTPS
                  const response = await fetch("/authcheck", {
                    method: "POST",
                    headers: {
                      "Content-Type": "application/json",
                    },
                    body: JSON.stringify({ idToken }),
                  });
    
                  if (!response.ok) {
                    throw new Error("Network response was not ok");
                  }
    
                  const data = await response.json();
    
                  // Handle server response here
                  console.log("User ID:", data.userId);
                } catch (error) {
                  // Handle error
                  console.error("Error:", error);
                }
              }
    
              sendTokenToServer();

    是的,我现在在服务器端使用 firebase admin(“firebase”是服务器上的实例)。

    回复
    0
  • P粉141911244

    P粉1419112442023-09-09 12:18:05

    为了验证用户服务器端,您需要生成 JWT 客户端,然后在服务器上验证它。 首先,在客户端生成 IdToken

    接下来,将请求中的令牌发送到服务器。您可以为此使用承载身份验证(作为 HTTP 标头发送。授权:承载)

    在服务器上,您可以使用任何 JWT 库来验证令牌。 如果您想使用 Firebase SDK,则必须使用正确的 SDK。 “firebase/compat/auth”适用于客户端。您需要 Firebase 管理 SDK, 以下链接介绍了如何使用 Firebase 管理员验证 ID 令牌SDK

    回复
    0
  • 取消回复