Nodejs + Firebase : Comment vérifier si l'utilisateur est authentifié côté serveur
P粉493313067
P粉493313067 2023-09-08 14:13:39
0
2
575

Les utilisateurs s'authentifient côté client à l'aide du SDK Firebase.

Côté serveur, il y a nodejs et le sdk est également installé. Ce code serveur fonctionne car je peux utiliser la base de données :

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);

Ce code fonctionne.

Il s'agit d'un itinéraire (rapide) où je souhaite obtenir des informations sur l'utilisateur :

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",
 });
});

Les variables utilisateur sont toujours vides.

Quelle est la bonne façon de gérer ce problème ?

  • Existe-t-il une fonction Firebase que je ne connais pas et qui peut récupérer les informations actuelles de l'utilisateur ?
  • Dois-je transmettre quelque chose à la demande ? Si oui, quel contenu est véhiculé ?

Comment gérer cette situation de manière plus générale ?

P粉493313067
P粉493313067

répondre à tous(2)
P粉360266095

aannabeengineer a raison. Il s'agit d'une preuve de concept (le code côté serveur doit être ajusté après l'authentification de l'utilisateur et la récupération des informations).

Serveur :

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" });
  }
});

Front-end :

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();

Oui, j'utilise maintenant Firebase admin côté serveur ("firebase" est l'instance sur le serveur).

P粉141911244

Afin d'authentifier les utilisateurs côté serveur, vous devez générer le client JWT puis le valider sur le serveur. Tout d'abord, générez IdToken p> côté client

Ensuite, envoyez le jeton dans la requête au serveur. Vous pouvez utiliser l'authentification du porteur pour cela (envoyée sous forme d'en-tête HTTP. Autorisation : porteur)

Sur le serveur, vous pouvez utiliser n'importe quelle bibliothèque JWT pour valider le jeton. Si vous souhaitez utiliser le SDK Firebase, vous devez utiliser le SDK correct. "firebase/compat/auth" est destiné aux clients. Vous avez besoin du SDK de gestion Firebase, Le lien suivant explique comment utiliser le SDK du jeton d'identification de validation d'administrateur Firebase

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal