web-dev-qa-db-fra.com

Comment authentifier un utilisateur dans firebase-admin dans nodejs?

En ce moment, je crée une API Firebase sur nodejs. Je voudrais traiter tous les trucs Firebase (comme l'authentification) avec firebase-admin sur nodejs. Mais quelle est la bonne façon d’authentifier un utilisateur via nodejs dans firebase-admin sans le SDK Javascript Firebase côté client? Sur la documentation officielle de pour admin , je n'ai pas trouvé de fonction appelée signInWithEmailAndPassword (comme sur le SDK côté client) pour nodejs. Il existe uniquement une fonction appelée " getUserByEmail ", mais cette fonction ne vérifie pas si l'utilisateur a saisi le mot de passe correct.

Ceci est ma forme:

<form class="sign-box" action="/login" method="post">

      <div class="form-group">
          <input id="username" name="username" type="text" class="form-control" placeholder="E-Mail"/>
      </div>
      <div class="form-group">
          <input id="password" name="password" type="password" class="form-control" placeholder="Password"/>
      </div>
      <button type="submit" class="btn btn-rounded">Sign in</button>

</form>

Une fois le formulaire soumis, je passe les valeurs à mon API dans nodejs:

app.post('/login', urlencodedParser, function (req, res) {

    // getting the values

    response = {
        username: req.body.username,
        password: req.body.password

    };    

    // authenticate the user here, but how ?

});

Ma première idée était d'utiliser le SDK Firebase côté client pour vous connecter avec signInWithEmailAndPassword et pour obtenir l'ID utilisateur. Une fois que j'ai eu l'UID, je voulais l'envoyer à nodejs et appeler la fonction createCustomToken et renvoyer le jeton généré (avec quelques revendications supplémentaires) au client. Une fois le jeton récupéré, j'utilisais la fonction signWithCustomToken (côté client) pour authentifier l'utilisateur. Ce chemin est-il correct ou existe-t-il un meilleur moyen?

8
Harry

En fait, pour l’authentification, vous devrez utiliser l’API standard de Firebase, pas l’administrateur. 

Cela vous donnera d’abord un jeton Firebase actualisé, et non un jeton personnalisé. Si vous le souhaitez, vous pouvez faire de même pour obtenir un jeton personnalisé. Si vous avez besoin d’un jeton personnalisé, j’ai également un exemple. 

npm installer firebase --save 

const firebase = require("firebase");
const config = {
    apiKey: "",
    authDomain: "",
    databaseURL: "",
    projectId: "",
    storageBucket: "",
    messagingSenderId: ""
};
firebase.initializeApp(config);

Je poste ma fonction de base de connexion, mais vous pourrez la modifier pour l'exprimer facilement.

exports.login = functions.https.onRequest((req, rsp)=>{
    const email = req.body.email;
    const password = req.body.password;
    const key = req.body.key;
    const _key = '_my_key_';
    let token = '';
    if(key === _key){           
    firebase.auth().signInWithEmailAndPassword(email,password).then((user)=>{
//The promise sends me a user object, now I get the token, and refresh it by sending true (obviously another promise)            
user.getIdToken(true).then((token)=>{
                rsp.writeHead(200, {"Content-Type": "application/json"});
                rsp.end(JSON.stringify({token:token}));
            }).catch((err)=>{
                rsp.writeHead(500, {"Content-Type": "application/json"});
                rsp.end(JSON.stringify({error:err}));
            });
        }).catch((err)=>{
            rsp.writeHead(500, {"Content-Type": "application/json"});
            rsp.end(JSON.stringify({error:err}));
        });
    } else {
        rsp.writeHead(500, {"Content-Type": "application/json"});
        rsp.end(JSON.stringify('error - no key'));
    }
});

REMARQUE: J'utilise cette fonction de connexion pour tester mes autres fonctions avec Postman. C'est pourquoi j'envoie une clé afin de pouvoir l'utiliser en privé.

Maintenant, en combinant les nœuds ADMIN et FIREBASE, je suis capable de faire beaucoup de choses très intéressantes avec des fonctions HTTP sur ma base de feu. 

J'espère que ça aide d'une certaine manière.

7
moplin

Pour tous les utilisateurs côté serveur J'ai été amené ici parce que je tentais d'authentifier des utilisateurs dans Firebase sans le SDK Javascript Firebase du côté client. Je construis une application de rendu rendu côté serveur. La base de données firebase.auth () côté client ne fonctionne pas sur un environnement de noeud côté serveur.

Il s'avère que vous pouvez exécuter des commandes firebase.auth () à l'intérieur de composantDidMount () , car cela ne s'exécute pas sur le serveur. C'est là que vous pouvez vous authentifier et récupérer le jeton de votre utilisateur, puis l'envoyer à une fonction cloud pour tout rendu côté serveur nécessitant une authentification de l'utilisateur.

Du côté du serveur, vous pouvez ensuite vérifier le jeton avec le sdk admin.

Vous devrez également exiger firebase/app et firebase/auth, puis initialiser Firebase dans votre bundle.js spécifique au navigateur, afin qu'il ne soit pas inclus dans le bundle.js de votre serveur.

componentDidMount() {
    firebase.auth().onAuthStateChanged(function(user) {
        if (user) {
            console.log("User signed in!");
        } else {
            console.log("User NOT signed in!");
        }
    });
}

0
Matthew Rideout