feat: Passwordless cross-device authentication

- Arkitektur: docs/auth/passwordless-architecture.md
- Backend: iom/quixzoom-auth-service/ (FastAPI + Redis)
- Webb: quixzoom-market-pages/se/login/ (QR-kod + polling)
- App: iom/quixzoom-app/src/features/auth/ (push + deep links)

Flöde: QR-kod → app-godkännande → webb-inloggad
This commit is contained in:
Bernt
2026-07-07 07:11:50 +00:00
parent 4aa984ad74
commit 6989a98d75
61843 changed files with 5491611 additions and 872231 deletions
+15
View File
@@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 180 180">
<defs>
<linearGradient id="lv-bg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#0A1628"/>
<stop offset="100%" stop-color="#0D1F3C"/>
</linearGradient>
<linearGradient id="lv-accent" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#00D4AA"/>
<stop offset="100%" stop-color="#00A884"/>
</linearGradient>
</defs>
<rect width="180" height="180" rx="40" fill="url(#lv-bg)"/>
<path d="M45 45 H78 V78 H135 V112 H45 Z" fill="url(#lv-accent)"/>
<circle cx="135" cy="56" r="11" fill="#FFFFFF"/>
</svg>

After

Width:  |  Height:  |  Size: 645 B

+16
View File
@@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 180 180">
<defs>
<linearGradient id="qz-bg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#0A0A0A"/>
<stop offset="100%" stop-color="#1A1A1A"/>
</linearGradient>
<linearGradient id="qz-accent" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#0066FF"/>
<stop offset="100%" stop-color="#0052CC"/>
</linearGradient>
</defs>
<rect width="180" height="180" rx="40" fill="url(#qz-bg)"/>
<circle cx="90" cy="90" r="56" fill="none" stroke="url(#qz-accent)" stroke-width="11"/>
<circle cx="90" cy="90" r="28" fill="url(#qz-accent)"/>
<circle cx="126" cy="54" r="8" fill="#FF3366"/>
</svg>

After

Width:  |  Height:  |  Size: 724 B

+18
View File
@@ -0,0 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<defs>
<linearGradient id="lv-bg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#0A1628"/>
<stop offset="100%" stop-color="#0D1F3C"/>
</linearGradient>
<linearGradient id="lv-accent" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#00D4AA"/>
<stop offset="100%" stop-color="#00A884"/>
</linearGradient>
</defs>
<!-- Background -->
<rect width="512" height="512" rx="128" fill="url(#lv-bg)"/>
<!-- L shape -->
<path d="M128 128 H224 V224 H384 V320 H128 Z" fill="url(#lv-accent)"/>
<!-- Data point -->
<circle cx="384" cy="160" r="32" fill="#FFFFFF"/>
</svg>

After

Width:  |  Height:  |  Size: 715 B

+19
View File
@@ -0,0 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<defs>
<linearGradient id="qz-bg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#0A0A0A"/>
<stop offset="100%" stop-color="#1A1A1A"/>
</linearGradient>
<linearGradient id="qz-accent" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#0066FF"/>
<stop offset="100%" stop-color="#0052CC"/>
</linearGradient>
</defs>
<!-- Background -->
<rect width="512" height="512" rx="128" fill="url(#qz-bg)"/>
<!-- Camera lens shape -->
<circle cx="256" cy="256" r="160" fill="none" stroke="url(#qz-accent)" stroke-width="32"/>
<circle cx="256" cy="256" r="80" fill="url(#qz-accent)"/>
<!-- QuiXzoom dot -->
<circle cx="360" cy="152" r="24" fill="#FF3366"/>
</svg>

After

Width:  |  Height:  |  Size: 807 B