Skip to content

การลงลายเซ็นและการตรวจสอบ

badges.ninja เผยแพร่อัตลักษณ์เชิงเข้ารหัสแบบสาธารณะ เพื่อให้บุคคลที่สามสามารถตรวจสอบข้อมูลรับรองที่มีลายเซ็นดิจิทัลได้ นี่คือรากฐานสำหรับการรองรับ Open Badges 3.0 / W3C Verifiable Credentials

ปลายทางเหล่านี้เป็นแบบสาธารณะและไม่ต้องมีการยืนยันตัวตน โดยอ้างอิงสัมพัทธ์กับ https://api.badges.ninja

Issuer DID

อัตลักษณ์ผู้ออก (issuer) ของแพลตฟอร์มคือตัวระบุ did:web:

did:web:api.badges.ninja

ตามกฎของ did:web ตัวระบุนี้จะแปลงไปยังเอกสาร DID ที่ให้บริการอยู่ที่พาธ well-known ด้านล่าง

เอกสาร DID

GET /.well-known/did.json

ส่งกลับเอกสาร DID ที่เปิดเผยคีย์สาธารณะสำหรับลงลายเซ็นของผู้ออก (Ed25519 JsonWebKey2020) ในรูปของ 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>"]
}

ชนิดเนื้อหาของการตอบกลับคือ application/did+json เอกสารนี้สามารถแคชได้ (จะเปลี่ยนแปลงเฉพาะเมื่อมีการหมุนคีย์)

JWKS

สำหรับผู้ตรวจสอบที่ต้องการค้นหาผ่าน JWK Set แทนการแปลง 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 คือ thumbprint ตามมาตรฐาน RFC 7638 ของคีย์สาธารณะ และตรงกับ fragment บน id ของ verificationMethod ในเอกสาร DID

Verifiable Credential (Open Badges 3.0)

รางวัลทุกรายการสามารถเรียกดูได้ในรูปแบบ Open Badges 3.0 / W3C Verifiable Credential ที่ลงลายเซ็นด้วยคีย์ของผู้ออกข้างต้น

GET /certify-badge/award/{guid}/vc
Queryผลลัพธ์
(ค่าเริ่มต้น) หรือ ?format=jwtVC-JWT ที่ลงลายเซ็น (application/jwt) — นำเข้าสู่กระเป๋า OB 3.0
?format=jsonJSON OpenBadgeCredential ที่ไม่ได้ลงลายเซ็น (application/vc+ld+json) — สำหรับการตรวจสอบ
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"

ข้อมูลรับรองนี้เป็น VC ที่มีชนิด ["VerifiableCredential", "OpenBadgeCredential"] (contexts https://www.w3.org/ns/credentials/v2 และ context ของ OB 3.0) โดย issuer.id ของมันคือ did:web:api.badges.ninja และข้อมูลความสำเร็จ อัตลักษณ์ผู้รับ (อีเมลที่ถูกแฮช) รวมถึงวันที่ออก/หมดอายุ มาจากรางวัลนั้น

การตรวจสอบ VC-JWT

โทเคนนี้เป็น JWS แบบ compact ที่มีลายเซ็น EdDSA วิธีตรวจสอบ:

  1. แยก JWT ออกเป็น header.payload.signature
  2. อ่าน kid จากส่วนหัว — ซึ่งชี้ไปยัง เอกสาร DID / JWKS
  3. ดึงคีย์สาธารณะมาแล้วตรวจสอบลายเซ็น Ed25519 เหนือ 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"));

ผู้รับยังสามารถดึงข้อมูลรับรองได้จากเมนู Download บนหน้าข้อมูลรับรองสาธารณะของตน (Verifiable Credential)

อัลกอริทึมลายเซ็น

ลายเซ็นใช้ Ed25519 (EdDSA) คีย์ส่วนตัวถูกเก็บรักษาไว้ฝั่งเซิร์ฟเวอร์และไม่เคยเปิดเผย มีเพียงคีย์สาธารณะข้างต้นเท่านั้นที่เผยแพร่

การตรวจสอบแบบโฮสต์ (Open Badges 2.0)

ข้อมูลรับรองทุกรายการยังสามารถตรวจสอบได้อย่างอิสระในวันนี้ผ่าน assertion แบบ Open Badge 2.0 ที่โฮสต์ไว้ ดู การตรวจสอบสาธารณะ สำหรับปลายทาง JSON ของ assertion เหรียญตรา และผู้ออก และดู การแชร์และการตรวจสอบ สำหรับหน้าการตรวจสอบที่แสดงต่อผู้รับ

badges.ninja Documentation