Skip to content

Firma y verificación ​

badges.ninja publica una identidad criptográfica pública para que terceros puedan verificar las credenciales que llevan una firma digital. Esta es la base de la compatibilidad con Open Badges 3.0 / W3C Verifiable Credentials.

Estos endpoints son públicos y no requieren autenticación. Son relativos a https://api.badges.ninja.

DID del emisor ​

La identidad del emisor de la plataforma es el identificador did:web:

did:web:api.badges.ninja

Según las reglas de did:web, esto se resuelve en el documento DID servido en la ruta well-known de más abajo.

Documento DID ​

GET /.well-known/did.json

Devuelve el documento DID que expone la clave pública de firma del emisor (una JsonWebKey2020 Ed25519) como su assertionMethod.

bash
curl https://api.badges.ninja/.well-known/did.json
json
{
  "@context": [
    "https://www.w3.org/ns/did/v1",
    "https://w3id.org/security/suites/jws-2020/v1"
  ],
  "id": "did:web:api.badges.ninja",
  "verificationMethod": [
    {
      "id": "did:web:api.badges.ninja#<kid>",
      "type": "JsonWebKey2020",
      "controller": "did:web:api.badges.ninja",
      "publicKeyJwk": { "kty": "OKP", "crv": "Ed25519", "x": "<base64url>" }
    }
  ],
  "assertionMethod": ["did:web:api.badges.ninja#<kid>"],
  "authentication": ["did:web:api.badges.ninja#<kid>"]
}

El tipo de contenido de la respuesta es application/did+json. El documento es cacheable (solo cambia al rotar la clave).

JWKS ​

Para los verificadores que prefieren el descubrimiento por JWK Set en lugar de la resolución DID:

GET /.well-known/jwks.json
bash
curl https://api.badges.ninja/.well-known/jwks.json
json
{
  "keys": [
    {
      "kty": "OKP",
      "crv": "Ed25519",
      "x": "<base64url>",
      "kid": "<thumbprint>",
      "alg": "EdDSA",
      "use": "sig"
    }
  ]
}

El kid es el thumbprint RFC 7638 de la clave pública y coincide con el fragmento del id de verificationMethod del documento DID.

Credencial verificable (Open Badges 3.0) ​

Cada credencial se puede obtener como una Open Badges 3.0 / W3C Verifiable Credential, firmada con la clave del emisor de más arriba.

GET /certify-badge/award/{guid}/vc
ConsultaResultado
(por defecto) o ?format=jwtEl VC-JWT firmado (application/jwt) — impórtalo a una cartera OB 3.0.
?format=jsonEl JSON OpenBadgeCredential sin firmar (application/vc+ld+json) — para inspección.
bash
# Signed credential (VC-JWT)
curl https://api.badges.ninja/certify-badge/award/<guid>/vc

# Human-readable credential JSON
curl "https://api.badges.ninja/certify-badge/award/<guid>/vc?format=json"

La credencial es una VC con tipo ["VerifiableCredential", "OpenBadgeCredential"] (contextos https://www.w3.org/ns/credentials/v2 y el contexto OB 3.0). Su issuer.id es did:web:api.badges.ninja, y el logro, la identidad del destinatario (correo con hash) y las fechas de emisión/caducidad provienen de la credencial.

Verificar un VC-JWT ​

El token es un JWS compacto con una firma EdDSA. Para verificarlo:

  1. Divide el JWT en header.payload.signature.
  2. Lee el kid de la cabecera — apunta al documento DID / JWKS.
  3. Obtén la clave pública y verifica la firma Ed25519 sobre header.payload.
js
import crypto from "node:crypto";

const [h, p, s] = jwt.split(".");
const jwks = await (await fetch("https://api.badges.ninja/.well-known/jwks.json")).json();
const jwk = jwks.keys[0];
const pub = crypto.createPublicKey({ key: jwk, format: "jwk" });
const ok = crypto.verify(null, Buffer.from(`${h}.${p}`), pub, Buffer.from(s, "base64url"));

Los destinatarios también pueden obtener la credencial desde el menú Download en su página pública de credencial (Verifiable Credential).

Algoritmo de firma ​

Las firmas usan Ed25519 (EdDSA). La clave privada se custodia en el servidor y nunca se expone; solo se publica la clave pública de más arriba.

Verificación alojada (Open Badges 2.0) ​

Cada credencial también es verificable de forma independiente hoy mismo mediante su assertion alojada de Open Badge 2.0. Consulta Verificación pública para los endpoints JSON de assertion, insignia y emisor, y Compartir y verificar para la página de verificación orientada al destinatario.

badges.ninja Documentation