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.
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