bae705aa97
- 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
123 lines
4.7 KiB
Markdown
123 lines
4.7 KiB
Markdown
# 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<String>` och `pub_key_pem: Option<String>` i `AppState`
|
|
- Lade till `org_id: Option<String>` och `roles: Option<Vec<String>>` 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) |
|