2017-10-08 9 views
1

J'ai une API qui utilise le noeud admin sdk pour se connecter et appeler firebase. Mes clients ont frappé mon api pour tout ce dont ils ont besoin. Je ne veux pas qu'ils aient à appeler Firebase pour s'authentifier directement parce que je veux que le code client soit découplé de l'API et du backend.Comment authentifier un utilisateur Firebase à partir du serveur sans authentification côté client?

Comment le serveur peut-il les authentifier? Basé sur les docs actuels, même au minimum les clients doivent fournir leur uid à l'API (ce qui suppose qu'ils authentifiés par eux-mêmes, non?).

Idéalement, les clients fourniraient un nom d'utilisateur et un mot de passe dans le corps d'un POST via ssl à mon API et l'API les connecterait et renverrait leur jeton d'identification. Quelle serait la façon recommandée de faire cela?

Répondre

3

Si vous souhaitez utiliser Firebase pour l'authentification, il est préférable de le gérer du côté client à l'aide d'un SDK client. En effet, l'authentification est limitée en fonction de l'adresse IP et vous permet également d'ignorer le processus de codage dans la gestion de sessions et la persistance. Toutefois, vous pouvez obtenir ce que vous voulez si vous attendez un faible nombre de connexions/utilisateurs en hébergeant le SDK client sur votre serveur et en renvoyant la requête à Firebase.

// app.js 

const bodyParser = require('body-parser'); 
const cookieParser = require('cookie-parser'); 
const express = require('express'); 
const firebase = require('firebase'); // client SDK 

firebase.initializeApp({ 
    apiKey: "<API_KEY>", 
    authDomain: "<PROJECT_ID>.firebaseapp.com" 
}); 

const app = express(); 
app.use(bodyParser.json()); 
app.use(cookieParser(['array', 'of', 'secrets'])); 

// on future requests, the UID can be found using `req.cookies['__session'].uid` 

app.post('/login', function (req, res, next) { 
    if (!req.body.email) return res.status(400).json({error: 'missing email'}); 
    if (!req.body.password) return res.status(400).json({error: 'missing password'}); 

    firebase.auth().setPersistence(firebase.auth.Auth.Persistence.NONE) // don't persist auth session 
    .then(function() { 
    return firebase.auth().signInWithEmailAndPassword(req.body.email, req.body.password) 
    }); 
    .then((user) => { // https://firebase.google.com/docs/reference/js/firebase.User 
    let uid = user.uid; 

    // set cookie with UID or some other form of persistence 
    // such as the Authorization header 
    res.cookie('__session', { uid: uid }, { signed: true, maxAge: 3600 }); 
    res.set('cache-control', 'max-age=0, private') // may not be needed. Good to have if behind a CDN. 
    res.send('You have successfully logged in'); 

    return firebase.auth().signOut(); //clears session from memory 
    }) 
    .catch((err) => { 
    next(err); 
    }); 
}); 

module.exports = app; 

Note: Vous pouvez également envisager de co-localiser votre API à l'aide Cloud Functions. Selon votre cas d'utilisation, cela peut être l'option rentable.

+0

Merci, cool que nous puissions exécuter la bibliothèque client sur le serveur, si nécessaire. Je vais garder la gestion de session dans les clients pour l'instant et voir jusqu'où je vais avec cette configuration. – Brian