Mediante la Verificación de aplicaciones, puedes proteger recursos de la app que no son de Firebase, como los backends autoalojados. Para ello, deberás hacer lo siguiente:
- Modifica el cliente de la app para que envíe un token de Verificación de aplicaciones junto con cada solicitud al backend, como se describe en las páginas de iOS+, Android y la Web.
- Modifica tu backend para que requiera un token válido de Verificación de aplicaciones con cada solicitud, como se describe en esta página.
Antes de comenzar
Si aún no lo has hecho, instala el SDK de Admin de Node.js.
Verifica los tokens
Agrega lógica a los extremos de la API a fin de verificar los tokens de Verificación de aplicaciones en tu backend para que haga lo siguiente:
Compruebe que cada solicitud incluya un token de la Verificación de aplicaciones.
Verifique el token de la Verificación de aplicaciones mediante el método
appCheck().verifyToken()
del SDK de Admin.Si la verificación se realiza de forma correcta,
verifyToken()
muestra el token de la Verificación de aplicaciones decodificado. La verificación correcta indica que el token se originó de una app que pertenece a tu proyecto de Firebase.
Rechaza cualquier solicitud que no cumpla con cualquiera de estos dos requisitos. Por ejemplo, si usas middleware de Express.js, haz lo siguiente:
const express = require('express');
const app = express();
const { initializeApp } = require("firebase-admin/app");
const { getAppCheck } = require("firebase-admin/app-check");
const firebaseApp = initializeApp();
const appCheckVerification = async (req, res, next) => {
const appCheckToken = req.header('X-Firebase-AppCheck');
if (!appCheckToken) {
res.status(401);
return next('Unauthorized');
}
try {
const appCheckClaims = await getAppCheck().verifyToken(appCheckToken);
// If verifyToken() succeeds, continue with the next middleware
// function in the stack.
return next();
} catch (err) {
res.status(401);
return next('Unauthorized');
}
}
app.get('/yourApiEndpoint', [appCheckVerification], (req, res) => {
// Handle request.
});
Protección contra la repetición (beta)
Para proteger un extremo de los ataques de repetición, puedes consumir el token de la Verificación de aplicaciones después de verificarlo para que pueda usarse solo una vez.
El uso de la protección contra la repetición agrega un proceso de ida y vuelta en la red a la llamada a verifyToken()
y, por lo tanto, agrega latencia a cualquier extremo que la use. Por este motivo,
te recomendamos que habilites la protección contra la repetición solo en extremos particularmente
sensibles.
Para usar la protección contra la repetición, primero asegúrate de que el rol de IAM “Verificador de tokens de la Verificación de aplicaciones de Firebase” esté habilitado para la cuenta de servicio que usas con el SDK de Admin. En Cloud Functions, suele ser la cuenta de servicio de procesamiento predeterminada; en otras plataformas, suele ser la cuenta de servicio del SDK de Admin. Puedes habilitar los roles de IAM en la consola de Cloud.
Luego, para consumir un token, pasa { consume: true }
al método verifyToken()
y examina el objeto Resultado. Si la propiedad alreadyConsumed
es
true
, rechaza la solicitud o aplica algún tipo de medida correctiva, como
requerir que el emisor pase otras verificaciones.
Por ejemplo:
const appCheckClaims = await getAppCheck().verifyToken(appCheckToken, { consume: true });
if (appCheckClaims.alreadyConsumed) {
res.status(401);
return next('Unauthorized');
}
// If verifyToken() succeeds and alreadyConsumed is not set, okay to continue.
Esta acción verificará el token y luego lo marcará como consumido. Las invocaciones futuras de
verifyToken(appCheckToken, { consume: true })
en el mismo token establecerán
alreadyConsumed
en true
(ten en cuenta que verifyToken()
no rechazará un token consumido ni se verificará si
se consume en caso de que no se configure consume
).
Si habilitas esta función para un extremo en particular, también debes actualizar el código de cliente de la app para adquirir tokens consumibles de uso limitado y utilizarlos con el extremo. Consulta la documentación del cliente para plataformas de Apple, Android y la Web.