Verifica los tokens de PNV de Firebase

Cuando la biblioteca Firebase PNV verifica correctamente el número de teléfono de un dispositivo, devuelve el número de teléfono verificado y un token firmado que lo contiene. Si usas el número de teléfono verificado fuera del cliente de la app, debes pasar el token en lugar del número de teléfono para poder verificar su integridad cuando lo uses. Para verificar el token, puedes usar cualquier biblioteca de verificación de JWT. Usa la biblioteca para verificar todo lo siguiente:

  • El encabezado typ se establece en JWT.

  • El token se firma con una de las claves publicadas en el extremo Firebase PNV de JWKS con el algoritmo ES256:

    https://fpnv.googleapis.com/v1beta/jwks
    
  • Las reclamaciones del emisor contienen el número de tu proyecto de Firebase y tienen el siguiente formato:

    https://fpnv.googleapis.com/projects/FIREBASE_PROJECT_NUMBER
    

    Puedes encontrar el número de tu proyecto de Firebase en la página Configuración del proyecto de Firebase console.

  • La reclamación de público es una lista que contiene el número y el ID de tu proyecto de Firebase, y tiene el siguiente formato:

    [
      https://fpnv.googleapis.com/projects/FIREBASE_PROJECT_NUMBER,
      https://fpnv.googleapis.com/projects/FIREBASE_PROJECT_ID,
    ]
    
  • El token no venció.

Ejemplo

Como ejemplo breve, la siguiente app de Express.js recibe un token de Firebase PNV de una solicitud POST HTTP y usa una biblioteca de verificación de JWT para comprobar la firma y las reclamaciones del token:

Node.js

import express from "express";
import { JwtVerifier } from "aws-jwt-verify";

// Find your Firebase project number in the Firebase console.
const FIREBASE_PROJECT_NUMBER = "123456789";

// The issuer and audience claims of the FPNV token are specific to your
// project.
const issuer = `https://fpnv.googleapis.com/projects/${FIREBASE_PROJECT_NUMBER}`;
const audience = `https://fpnv.googleapis.com/projects/${FIREBASE_PROJECT_NUMBER}`;

// The JWKS URL contains the current public signing keys for FPNV tokens.
const jwksUri = "https://fpnv.googleapis.com/v1beta/jwks";

// Configure a JWT verifier to check the following:
// - The token is signed by Google
// - The issuer and audience claims match your project
// - The token has not yet expired (default behavior)
const fpnvVerifier = JwtVerifier.create({ issuer, audience, jwksUri });

const app = express();

app.post('/verifiedPhoneNumber', async (req, res) => {
    if (!req.body) return res.sendStatus(400);
    // Get the token from the body of the request.
    const fpnvToken = req.body;
    try {
        // Attempt to verify the token using the verifier configured
        previously.
        const verifiedPayload = await fpnvVerifier.verify(fpnvToken);

        // If verification succeeds, the subject claim of the token contains the
        // verified phone number. You can use this value however it's needed by
        // your app.
        const verifiedPhoneNumber = verifiedPayload.sub;
        // (Do something with it...)

        return res.sendStatus(200);
    } catch {
        // If verification fails, reject the token.
        return res.sendStatus(400);
    }
});

app.listen(3000);