Maison > Questions et réponses > le corps du texte
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 ?
Comment gérer cette situation de manière plus générale ?
P粉3602660952023-09-09 13:15:25
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粉1419112442023-09-09 12:18:05
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