Skip to content

Signering och verifiering

badges.ninja publicerar en offentlig kryptografisk identitet så att tredje part kan verifiera intyg som bär en digital signatur. Detta är grunden för stödet för Open Badges 3.0 / W3C Verifiable Credentials.

Dessa slutpunkter är offentliga och kräver ingen autentisering. De är relativa till https://api.badges.ninja.

Utfärdar-DID

Plattformens utfärdaridentitet är did:web-identifieraren:

did:web:api.badges.ninja

Enligt did:web-reglerna löses detta till DID-dokumentet som serveras på den välkända sökvägen nedan.

DID-dokument

GET /.well-known/did.json

Returnerar DID-dokumentet som exponerar utfärdarens offentliga signeringsnyckel (en Ed25519 JsonWebKey2020) som dess 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>"]
}

Svarets innehållstyp är application/did+json. Dokumentet är cachebart (det ändras endast vid nyckelrotation).

JWKS

För verifierare som föredrar JWK Set-upptäckt framför DID-upplösning:

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 är RFC 7638-tumavtrycket av den offentliga nyckeln och matchar fragmentet på DID-dokumentets verificationMethod-id.

Verifierbart intyg (Open Badges 3.0)

Varje utmärkelse kan hämtas som ett Open Badges 3.0 / W3C Verifiable Credential, signerat med utfärdarnyckeln ovan.

GET /certify-badge/award/{guid}/vc
FrågaResultat
(standard) eller ?format=jwtDet signerade VC-JWT (application/jwt) — importera till en OB 3.0-plånbok.
?format=jsonDet osignerade OpenBadgeCredential-JSON (application/vc+ld+json) — för inspektion.
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"

Intyget är ett ["VerifiableCredential", "OpenBadgeCredential"]-typat VC (kontexter https://www.w3.org/ns/credentials/v2 och OB 3.0-kontexten). Dess issuer.id är did:web:api.badges.ninja, och prestationen, mottagaridentiteten (hashad e-post) och utfärdande-/utgångsdatumen kommer från utmärkelsen.

Verifiera ett VC-JWT

Token är en kompakt JWS med en EdDSA-signatur. För att verifiera:

  1. Dela upp JWT:n i header.payload.signature.
  2. Läs kid från headern — den pekar in i DID-dokumentet / JWKS.
  3. Hämta den offentliga nyckeln och verifiera Ed25519-signaturen över 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"));

Mottagare kan också hämta intyget från menyn Download på sin offentliga intygssida (Verifiable Credential).

Signaturalgoritm

Signaturer använder Ed25519 (EdDSA). Den privata nyckeln förvaras på serversidan och exponeras aldrig; endast den offentliga nyckeln ovan publiceras.

Värdbaserad verifiering (Open Badges 2.0)

Varje intyg är även oberoende verifierbart idag via sitt värdbaserade Open Badge 2.0-påstående. Se Offentlig verifiering för påstående-, märkes- och utfärdar-JSON-slutpunkterna, och Delning och verifiering för den mottagarvända verifieringssidan.

badges.ninja Documentation