functions - firebase http get
¿Cómo proteger el punto final HTTP de Firebase Cloud Function para permitir solo usuarios autenticados de Firebase? (3)
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 devolver 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?
Como mencionó @Doug, puede usar
firebase-admin
para verificar un token.
He configurado un ejemplo rápido:
exports.auth = functions.https.onRequest((req, res) => {
cors(req, res, () => {
const tokenId = req.get(''Authorization'').split(''Bearer '')[1];
return admin.auth().verifyIdToken(tokenId)
.then((decoded) => res.status(200).send(decoded))
.catch((err) => res.status(401).send(err));
});
});
En el ejemplo anterior, también he habilitado CORS, pero eso es opcional.
Primero, obtienes el encabezado de
Authorization
y descubres el
token
.
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.
Espero que ayude.
Como también mencionó @Doug, puede usar las funciones invocables para excluir parte del código repetitivo de su cliente y su servidor.
Función invocable de examen:
export const getData = functions.https.onCall((data, context) => {
// verify Firebase Auth ID token
if (!context.auth) {
return { message: ''Authentication Required!'', code: 401 };
}
// do your things..
const uid = context.auth.uid;
const query = data.query;
return { message: ''Some Data'', code: 400 };
});
Se puede invocar directamente desde su cliente así:
firebase.functions().httpsCallable(''getData'')({query}).then(result => console.log(result));
Hay un ejemplo de código oficial para lo que estás tratando de 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 este boilerplate, si su aplicación puede usar las bibliotecas de cliente de Firebase.