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
+11 -11
View File
@@ -101,7 +101,7 @@
.row:last-child { border-bottom: none; }
.row-icon {
width: 36px; height: 36px;
border-radius: 8px;
border-radius: var(--radius-md);
display: flex; align-items: center; justify-content: center;
font-size: 18px;
flex-shrink: 0;
@@ -201,21 +201,21 @@ body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
<div class="section-num">§ 2</div>
<div class="card-title">Requirements to become a Zoomer</div>
<div class="row">
<div class="row-icon blue">🪪</div>
<div class="row-icon blue"></div>
<div class="row-content">
<div class="row-label">Age and identity</div>
<div class="row-sub">You must be at least 18 years old. We verify your identity using a valid photo ID (passport or national ID card).</div>
</div>
</div>
<div class="row">
<div class="row-icon green">📱</div>
<div class="row-icon green"></div>
<div class="row-content">
<div class="row-label">Equipment</div>
<div class="row-sub">Smartphone with camera ≥12 MP and GPS. iOS 16+ or Android 12+. Stable internet connection.</div>
</div>
</div>
<div class="row">
<div class="row-icon orange">💼</div>
<div class="row-icon orange"></div>
<div class="row-content">
<div class="row-label">Tax</div>
<div class="row-sub">You are responsible for your own tax reporting in accordance with applicable law in your country.</div>
@@ -240,21 +240,21 @@ body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
<div class="section-num">§ 4</div>
<div class="card-title">Image requirements and quality</div>
<div class="row">
<div class="row-icon blue">📷</div>
<div class="row-icon blue"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2" y="4" width="12" height="9" rx="2" stroke="#666" stroke-width="1.5"/><circle cx="8" cy="8.5" r="2.5" stroke="#666" stroke-width="1.5"/><path d="M5 4L6 2H10L11 4" stroke="#666" stroke-width="1.5"/></svg></div>
<div class="row-content">
<div class="row-label">Technical requirements</div>
<div class="row-sub">Min. 2 MB per image, unedited (no filters, no edits). EXIF data must be preserved.</div>
</div>
</div>
<div class="row">
<div class="row-icon green"></div>
<div class="row-icon green"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><circle cx="10" cy="10" r="9" stroke="#22c55e" stroke-width="2"/><path d="M6 10L9 13L14 7" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div>
<div class="row-content">
<div class="row-label">Accuracy</div>
<div class="row-sub">Images must match the specified object and location. Manipulation or fabrication is prohibited and will result in immediate suspension and legal action.</div>
</div>
</div>
<div class="row">
<div class="row-icon orange">🏘️</div>
<div class="row-icon orange"></div>
<div class="row-content">
<div class="row-label">Privacy</div>
<div class="row-sub">Do not photograph individuals without consent. Avoid including private property outside the scope of the mission. You are responsible for obtaining any necessary permissions.</div>
@@ -321,14 +321,14 @@ body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
<div class="section-num">§ 9</div>
<div class="card-title">Account closure</div>
<div class="row">
<div class="row-icon blue">🚪</div>
<div class="row-icon blue"></div>
<div class="row-content">
<div class="row-label">You can close your account at any time</div>
<div class="row-sub">Go to Settings → Account → Close account. Outstanding compensation will be paid out within 14 days.</div>
</div>
</div>
<div class="row">
<div class="row-icon red">🚫</div>
<div class="row-icon red"></div>
<div class="row-content">
<div class="row-label">We may close accounts for violations</div>
<div class="row-sub">We reserve the right to immediately close accounts that violate these terms, without prior notice for serious violations.</div>
@@ -346,14 +346,14 @@ body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
<div class="card">
<div class="card-title">Contact</div>
<div class="row">
<div class="row-icon blue">⚖️</div>
<div class="row-icon blue"></div>
<div class="row-content">
<div class="row-label">Legal enquiries</div>
<div class="row-sub"><a href="mailto:legal@quixzoom.com">legal@quixzoom.com</a></div>
</div>
</div>
<div class="row">
<div class="row-icon green">🆘</div>
<div class="row-icon green"></div>
<div class="row-content">
<div class="row-label">Support</div>
<div class="row-sub"><a href="/support">quixzoom.com/support</a></div>