Skip to content

Podpisywanie i weryfikacja ​

badges.ninja publikuje publiczną tożsamość kryptograficzną, aby strony trzecie mogły weryfikować poświadczenia opatrzone podpisem cyfrowym. Jest to podstawa obsługi Open Badges 3.0 / W3C Verifiable Credentials.

Te endpointy są publiczne i nie wymagają uwierzytelnienia. Są względne do https://api.badges.ninja.

DID wystawcy ​

Tożsamość wystawcy platformy to identyfikator did:web:

did:web:api.badges.ninja

Zgodnie z regułami did:web, rozwiązuje się on do dokumentu DID serwowanego pod ścieżką well-known poniżej.

Dokument DID ​

GET /.well-known/did.json

Zwraca dokument DID ujawniający publiczny klucz podpisujący wystawcy (Ed25519 JsonWebKey2020) jako jego 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>"]
}

Typ zawartości odpowiedzi to application/did+json. Dokument jest buforowalny (zmienia się tylko przy rotacji klucza).

JWKS ​

Dla weryfikatorów, którzy wolą wykrywanie JWK Set od rozwiązywania 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"
    }
  ]
}

kid to odcisk palca klucza publicznego według RFC 7638 i pasuje do fragmentu w identyfikatorze verificationMethod dokumentu DID.

Poświadczenie weryfikowalne (Open Badges 3.0) ​

Każde wyróżnienie można pobrać jako Open Badges 3.0 / W3C Verifiable Credential, podpisane kluczem wystawcy powyżej.

GET /certify-badge/award/{guid}/vc
ZapytanieWynik
(domyślnie) lub ?format=jwtPodpisany VC-JWT (application/jwt) — zaimportuj do portfela OB 3.0.
?format=jsonNiepodpisany JSON OpenBadgeCredential (application/vc+ld+json) — do wglądu.
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"

Poświadczenie to VC typu ["VerifiableCredential", "OpenBadgeCredential"] (konteksty https://www.w3.org/ns/credentials/v2 oraz kontekst OB 3.0). Jego issuer.id to did:web:api.badges.ninja, a osiągnięcie, tożsamość odbiorcy (zahaszowany e-mail) oraz daty wystawienia/wygaśnięcia pochodzą z wyróżnienia.

Weryfikacja VC-JWT ​

Token to kompaktowy JWS z podpisem EdDSA. Aby zweryfikować:

  1. Podziel JWT na header.payload.signature.
  2. Odczytaj kid z nagłówka — wskazuje on na dokument DID / JWKS.
  3. Pobierz klucz publiczny i zweryfikuj podpis Ed25519 nad 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"));

Odbiorcy mogą też pobrać poświadczenie z menu Download na swojej publicznej stronie poświadczenia (Verifiable Credential).

Algorytm podpisu ​

Podpisy używają Ed25519 (EdDSA). Klucz prywatny jest przechowywany po stronie serwera i nigdy nie jest ujawniany; publikowany jest tylko klucz publiczny powyżej.

Weryfikacja hostowana (Open Badges 2.0) ​

Każde poświadczenie jest też dziś niezależnie weryfikowalne poprzez swój hostowany wpis asercji Open Badge 2.0. Zobacz Weryfikacja publiczna dla endpointów JSON asercji, odznaki i wystawcy oraz Udostępnianie i weryfikacja dla strony weryfikacji skierowanej do odbiorcy.

badges.ninja Documentation