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

oknrviil  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(106)

在客户端使用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",
 });
});


用户变量始终为null。
如何正确处理这件事?

  • 有没有一个firebase函数我不知道,可以检索当前的用户信息?
  • 我是否应该向请求传递一些东西,如果是,是什么?

一般来说,如何处理这种情况?

jtjikinw

jtjikinw1#

为了在服务器端验证用户,您需要生成一个JWT客户端,然后在服务器上进行验证。首先,在客户端生成IdToken
接下来,沿着请求中的令牌发送到服务器。您可以为此使用承载身份验证(作为HTTP头发送。授权:持票人)
在服务器上,可以使用任何JWT库来验证令牌。如果要使用Firebase SDK,则必须使用正确的SDK。“firebase/compat/auth”用于客户端。您需要Firebase Admin SDK,此处是如何使用Firebase Admin SDK验证ID令牌的链接

wljmcqd8

wljmcqd82#

awannabeengineer是对的。这里是一个概念证明(必须在检索到用户身份验证和信息后在服务器端代码上进行适配)。
伺服器:

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”是服务器上的示例)。

相关问题