# 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`, `Validation` från `jsonwebtoken` - Lade till `priv_key_pem: Option` och `pub_key_pem: Option` i `AppState` - Lade till `org_id: Option` och `roles: Option>` i `Claims`-struct - Ny funktion `issue_jwt_full()` som signerar med RS256 när privat nyckel finns, annars HS256 - `TokenBody` utökad med `org_id` (default: `wavult-group`) och `roles` (default: `["admin"]`) - `issue_token` handler använder nu `issue_jwt_full` och inkluderar `algorithm` i svaret - Ny `/api/auth/validate` POST-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 ```bash 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) |