Estoy creando una aplicación móvil nativa de reacción con autenticación de usuario. Decidí usar la autenticación de Firebase porque es relativamente fácil de implementar.
Quiero usar mi propio backend (nodo, express) y mi propia base de datos (MongoDB) y necesito proteger mis llamadas API para verificar si el usuario está autenticado y si tiene permiso para realizar la operación.
Pero no me siento cómodo con la validación de tokens y no estoy seguro de hacerlo de la manera correcta...
Así es como estoy tratando de hacer una solicitud GET o POST simple desde el cliente (aplicación móvil):
En el cliente, recupero el token de usuario actual y lo envío en el encabezado de mi solicitud GET:
firebase.auth().currentUser.getIdToken(true).then(token => { fetch('http://localhost:3000', { method: 'GET', mode: 'cors', headers: { 'AuthToken': token } }).then(res => res.json().then(res => console.log(res))) .catch(err => console.log(err))En el servidor, uso un middleware para verificar el token gracias al administrador de Firebase.
function checkAuth(req, res, next) { if (req.headers.authtoken) { admin.auth().verifyIdToken(req.headers.authtoken) .then((token) => { console.log(token) next() }).catch(() => { res.status(403).send('Unauthorized') }); } else { res.status(403).send('Unauthorized') } }Entonces, para una solicitud de obtención simple de un usuario registrado, tengo que hacer lo siguiente:
¿Lo estoy haciendo de la manera correcta? No sé si debo almacenar el IdToken en la memoria del teléfono para evitar obtenerlo de Firebase cada vez (pero el token caduca después de 1 hora...)
Parece una gran cantidad de operaciones de "comprobación desde firebase" solo para una simple búsqueda ...
¿Me puede dar algún consejo sobre cómo hacer que todo esto sea más eficiente?
Muchas gracias !
En general, su flujo me parece correcto, pero hay algunas cosas que optimizaría.
Al pasar true a getIdToken(true) , lo obliga a actualizar el token cada vez antes de ejecutar su fetch .
No es necesario, ya que Firebase ya actualiza automáticamente el token de identificación en segundo plano. Por lo tanto, puede hacerlo con menos recursos y un poco más rápido con:
firebase.auth().currentUser.getIdToken().then(token => { fetch('http://localhost:3000', { ... Después de llamar a admin.auth().verifyIdToken(req.headers.authtoken) , obtiene un resultado que también muestra cuánto tiempo es válido el token. Por lo tanto, puede almacenar en caché el token verificado en algún lugar hasta que esté cerca de ese momento y usar esa versión almacenada en caché si obtiene la misma entrada. Eso le ahorra llamadas para verificar IdToken`.