Con la nueva función de nube de Firebase, he decidido mover algunos de mis puntos finales HTTP a Firebase. Todo funciona muy bien ... Pero tengo el siguiente problema. Tengo dos puntos finales construidos por disparadores HTTP (Funciones en la nube)
- Un punto final de API para crear usuarios y devuelve el token personalizado generado por Firebase Admin SDK.
- Un punto final de API para obtener ciertos detalles del usuario.
Si bien el primer punto final está bien, pero para mi segundo punto final, me gustaría protegerlo solo para usuarios autenticados. es decir, alguien que tiene el token que generé anteriormente.
¿Cómo hago para resolver esto?
Sé que podemos obtener los parámetros de encabezado en la función de nube usando
request.get('x-myheader')
pero ¿hay alguna manera de proteger el punto final al igual que proteger la base de datos en tiempo real?
Respuestas:
Hay una muestra de código oficial para lo que estás intentando hacer. Lo que ilustra es cómo configurar su función HTTPS para requerir un encabezado de autorización con el token que recibió el cliente durante la autenticación. La función usa la biblioteca firebase-admin para verificar el token.
Además, puede usar " funciones invocables " para facilitar mucho esta versión repetitiva, si su aplicación puede usar las bibliotecas de cliente de Firebase.
fuente
Como mencionó @Doug, puede usar
firebase-admin
para verificar un token. He configurado un ejemplo rápido:En el ejemplo anterior, también he habilitado CORS, pero eso es opcional. Primero, obtienes el
Authorization
encabezado y descubres eltoken
.Luego, puede usar
firebase-admin
para verificar ese token. Obtendrá la información decodificada para ese usuario en la respuesta. De lo contrario, si el token no es válido, arrojará un error.fuente
getIdToken()
método en documentos del lado del cliente (por ejemplo, firebasefirebase.auth().currentUser.getIdToken().then(token => console.log(token))
)Como también mencionó @Doug, puede usar las funciones invocables para excluir algunos códigos repetitivos de su cliente y su servidor.
Función invocable de examen:
Se puede invocar directamente desde su cliente así:
fuente
Los métodos anteriores autentican al usuario usando lógica dentro la función, por lo que aún se debe invocar la función para realizar la comprobación.
Es un método totalmente bueno, pero en aras de la comprensión, hay una alternativa:
Puede configurar una función como "privada" para que no pueda ser invocada excepto por usuarios registrados (usted decide los permisos). En este caso, las solicitudes no autenticadas se rechazan fuera del contexto de la función, y la función no se rechaza. invoca en absoluto.
Aquí hay referencias a (a) Configurar funciones como públicas / privadas , y luego (b) autenticar a los usuarios finales en sus funciones .
Tenga en cuenta que los documentos anteriores son para Google Cloud Platform, y de hecho, esto funciona porque cada proyecto de Firebase también es un proyecto GCP. Una advertencia relacionada con este método es que, al momento de escribir, solo funciona con la autenticación basada en la cuenta de Google.
fuente
Hay un buen ejemplo oficial sobre el uso de Express: puede ser útil en el futuro: https://github.com/firebase/functions-samples/blob/master/authorized-https-endpoint/functions/index.js (pegado a continuación solo sin lugar a duda)
Tenga en cuenta que
exports.app
sus funciones están disponibles bajo/app
slug (en este caso, solo hay una función y está disponible bajo<you-firebase-app>/app/hello
. Para deshacerse de ella, en realidad necesita reescribir la parte Express un poco (la parte de middleware para la validación sigue siendo la misma, funciona muy bien) bueno y es bastante comprensible gracias a los comentarios).Mi reescritura para deshacerme de
/app
:fuente
He estado luchando para obtener la autenticación de Firebase adecuada en la función Golang GCP. En realidad no hay ningún ejemplo para eso, así que decidí construir esta pequeña biblioteca: https://github.com/Jblew/go-firebase-auth-in-gcp-functions
Ahora puede autenticar fácilmente a los usuarios usando firebase-auth (que es distinto de las funciones autenticadas de gcp y no es compatible directamente con el proxy de reconocimiento de identidad).
Aquí hay un ejemplo del uso de la utilidad:
Solo tenga en cuenta implementar su función con la
--allow-unauthenticated
marca (porque la autenticación de Firebase ocurre dentro de la ejecución de la función).Espero que esto te ayude como me ayudó a mí. Estaba decidido a usar golang para funciones en la nube por razones de rendimiento - Jędrzej
fuente
En Firebase, para simplificar su código y su trabajo, es solo una cuestión de diseño arquitectónico :
Express
. Para restringir solo un sitio samesite o específico , useCORS
para controlar este aspecto de la seguridad. Esto tiene sentido porqueExpress
es útil para SEO debido a su contenido de representación del lado del servidor.context
parámetro para guardar todas las molestias. Esto también tiene sentido, porque, como una aplicación de una sola página creada con AngularJS, AngularJS es mala para el SEO, pero como es una aplicación protegida por contraseña, tampoco necesita mucho SEO. En cuanto a la creación de plantillas, AngularJS tiene plantillas incorporadas, por lo que no es necesario usar una plantilla del lado del servidorExpress
. Entonces las funciones invocables de Firebase deberían ser lo suficientemente buenas.Con lo anterior en mente, no más problemas y haz la vida más fácil.
fuente