- Add NFC ePassport roadmap (ICAO 9303, eIDAS) - Add TensorFlow.js edge face detection (BlazeFace) - Add structured audit logger (GDPR-compliant) - Risk scoring support Part of KYC Apple Native UX v1.1.0
4.7 KiB
Auth Integration Result: aamos-ledger ↔ ouroboros-identity (RS256)
Date: 2026-06-05
Status: ✅ KOMPLETT — Alla tester godkända
Sammanfattning
RS256-integration mellan ouroboros-identity (port 3207) och aamos-ledger (port 3250) är nu aktiv.
Vad som gjordes
Viktigt fynd
Port 3207 kördes av en Rust-binär (/home/bernt/bin/ouroboros-identity), inte Node.js-versionen som låg i /opt/amos/services/ouroboros-identity/index.mjs. Rust-källkoden finns i /home/bernt/rust/ouroboros-identity/.
Steg 1: ouroboros-identity Rust-binär — RS256 signing
Fil: /home/bernt/rust/ouroboros-identity/src/main.rs
Ändringar:
- Importerade
decode,Algorithm,DecodingKey,Validationfrånjsonwebtoken - Lade till
priv_key_pem: Option<String>ochpub_key_pem: Option<String>iAppState - Lade till
org_id: Option<String>ochroles: Option<Vec<String>>iClaims-struct - Ny funktion
issue_jwt_full()som signerar med RS256 när privat nyckel finns, annars HS256 TokenBodyutökad medorg_id(default:wavult-group) ochroles(default:["admin"])issue_tokenhandler använder nuissue_jwt_fulloch inkluderaralgorithmi svaret- Ny
/api/auth/validatePOST-endpoint som verifierar token med pubkey RS256 (eller HS256 fallback) main()laddar nycklarna från/opt/amos/data/keys/vid startup
Nycklar laddas från:
- Private key:
/opt/amos/data/keys/jwt-private.pem - Public key:
/opt/amos/data/keys/jwt-public.pem
Steg 2: Binär bygd och driftsatt
su - bernt -c 'cd /home/bernt/rust/ouroboros-identity && cargo build --release'
pkill -f ouroboros-identity
cp target/release/ouroboros-identity /home/bernt/bin/ouroboros-identity
systemctl restart ouroboros-identity
Steg 3: aamos-ledger auth.mjs
Redan korrekt konfigurerad — läser /opt/amos/data/keys/jwt-public.pem och verifierar RS256. ✓
Steg 4: /api/auth/validate i aamos-ledger
Fil: /opt/amos/services/aamos-ledger/index.mjs
- Lade till
import jwt from 'jsonwebtoken' - Ny GET-endpoint
/api/auth/validate?token=xxx(unauthenticated) - Verifierar med pubkey RS256 om den finns, annars HS256 fallback
- Svar:
{ok: true, claims: {...}}eller{ok: false, error: "..."}
Steg 5: Node.js-versionen av identity (oautentiseringsbar backup)
Fil: /opt/amos/services/ouroboros-identity/index.mjs
- Patchades även (RS256 + validate endpoint) men används inte i produktion (Rust-versionen är aktiv)
Test-resultat (end-to-end)
=== Step 1: Get token from identity (RS256) ===
Algorithm: RS256
JWT header: {"alg":"RS256","typ":"JWT"}
=== Step 2: Use token against ledger ===
Ledger response: {"ok":true,"periods":[...]} ← 200 OK, ej 401
=== Step 3: Validate token via identity ===
Validate response: {"ok":true,"claims":{
"sub":"erik@wavult.com",
"org_id":"wavult-group",
"roles":["admin"],
...
}}
=== Ledger /api/auth/validate GET ===
{"ok": true, "claims": {"sub": "erik@wavult.com", "org_id": "wavult-group", "roles": ["admin"], ...}}
=== Invalid token test ===
{"ok": false, "error": "invalid token"}
✅ TOKEN från identity accepteras av ledger utan 401
✅ /api/auth/validate returnerar claims korrekt (identity)
✅ /api/auth/validate returnerar claims korrekt (ledger)
✅ Felaktig token ger 401 med tydligt felmeddelande
Arkitektur
RS256 private key sign
┌──────────────────────┐
Client ──────────▶ │ ouroboros-identity │ :3207 (Rust)
│ POST /api/auth/token │
│ POST /api/auth/validate │
└──────────────────────┘
│ JWT (RS256)
▼
┌──────────────────────┐
│ aamos-ledger │ :3250 (Node.js)
│ auth.mjs RS256 verify│
│ GET /api/auth/validate │
└──────────────────────┘
│ RS256 public key verify
/opt/amos/data/keys/jwt-public.pem
Filer modifierade
| Fil | Ändring |
|---|---|
/home/bernt/rust/ouroboros-identity/src/main.rs |
RS256 signing, org_id/roles claims, /api/auth/validate |
/home/bernt/bin/ouroboros-identity |
Ny binär (bygd från source) |
/opt/amos/services/aamos-ledger/index.mjs |
jwt import, /api/auth/validate GET endpoint |
/opt/amos/services/ouroboros-identity/index.mjs |
RS256 fallback + validate (backup, ej i drift) |