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
+10 -13
View File
@@ -48,7 +48,7 @@
.nav-links{display:flex;align-items:center;gap:32px;flex:1;justify-content:center;list-style:none}
.nav-links a{color:rgba(255,255,255,.75);font-size:var(--text-base);font-weight:500;transition:color .15s}
.nav-links a:hover{color:#fff}
.btn-nav{background:var(--blue);color:#fff;border:none;border-radius:var(--radius-lg);padding:10px 24px;font-size:var(--text-base);font-weight:700;transition:background .15s;white-space:nowrap;flex-shrink:0;text-decoration:none;display:inline-block}
.btn-nav{background:var(--blue);color:#fff;border:none;border-radius: var(--radius-lg);padding:10px 24px;font-size:var(--text-base);font-weight:700;transition:background .15s;white-space:nowrap;flex-shrink:0;text-decoration:none;display:inline-block}
.btn-nav:hover{background:var(--blue-dark)}
@media(max-width:768px){.nav-links{display:none}.btn-nav{display:none}}
@@ -75,7 +75,7 @@
.resource-row{
display:flex;align-items:center;justify-content:space-between;gap:24px;
background:#fff;border:1.5px solid #EAEAEA;border-radius:var(--radius-md);
background:#fff;border:1.5px solid #EAEAEA;border-radius: var(--radius-md);
padding:20px 24px;
transition:border-color .2s,box-shadow .2s,transform .2s;
}
@@ -92,7 +92,7 @@
.resource-tag{
flex-shrink:0;
font-size:.7rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
background:var(--blue-pale);color:var(--blue);border-radius:6px;padding:4px 10px;
background:var(--blue-pale);color:var(--blue);border-radius: var(--radius-sm);padding:4px 10px;
}
.resource-arrow{
@@ -108,16 +108,16 @@
.footer-brand-col .footer-logo .x{color:var(--qx-blue,#0066FF)}
.footer-brand-col .footer-desc{font-size:.8rem;color:rgba(255,255,255,.75);line-height:1.6;margin-bottom:20px}
.footer-social-row{display:flex;gap:10px}
.footer-soc-btn{width:36px;height:36px;border-radius:8px;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.12);display:flex;align-items:center;justify-content:center;color:rgba(255,255,255,.7);text-decoration:none;transition:background .15s,color .15s}
.footer-soc-btn{width:36px;height:36px;border-radius: var(--radius-md);background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.12);display:flex;align-items:center;justify-content:center;color:rgba(255,255,255,.7);text-decoration:none;transition:background .15s,color .15s}
.footer-soc-btn:hover{background:rgba(255,255,255,.16);color:#fff}
.footer-col-title{font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:rgba(255,255,255,.75);margin-bottom:16px}
.footer-col-links{list-style:none;padding:0;margin:0}
.footer-col-links li{margin-bottom:10px}
.footer-col-links a{font-size:.875rem;color:rgba(255,255,255,.65);text-decoration:none;transition:color .15s}
.footer-col-links a:hover{color:#fff}
.badge-new{font-size:.65rem;font-weight:700;background:var(--qx-blue,#0066FF);color:#fff;padding:1px 5px;border-radius:4px;margin-left:5px;vertical-align:middle}
.badge-new{font-size:.65rem;font-weight:700;background:var(--qx-blue,#0066FF);color:#fff;padding:1px 5px;border-radius: var(--radius-sm);margin-left:5px;vertical-align:middle}
.footer-trust{display:flex;align-items:center;gap:16px;margin-top:20px;flex-wrap:wrap}
.trust-badge{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.1);border-radius:8px;padding:8px 12px;font-size:.72rem;font-weight:700;color:rgba(255,255,255,.7);display:flex;align-items:center;gap:6px;letter-spacing:.02em}
.trust-badge{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.1);border-radius: var(--radius-md);padding:8px 12px;font-size:.72rem;font-weight:700;color:rgba(255,255,255,.7);display:flex;align-items:center;gap:6px;letter-spacing:.02em}
.footer-bottom{max-width:1200px;margin:0 auto;padding:20px 32px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px}
.footer-copy{font-size:.8rem;color:rgba(255,255,255,.75)}
.footer-legal-links{display:flex;gap:20px}
@@ -125,7 +125,7 @@
.footer-legal-links a:hover{color:rgba(255,255,255,.8)}
.footer-lang-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.footer-lang-row .fl-lbl{font-size:.72rem;color:rgba(255,255,255,.75)}
.flang{font-size:.78rem;color:rgba(255,255,255,.75);text-decoration:none;padding:3px 6px;border-radius:4px}
.flang{font-size:.78rem;color:rgba(255,255,255,.75);text-decoration:none;padding:3px 6px;border-radius: var(--radius-sm)}
.flang:hover,.flang.active{background:rgba(255,255,255,.1);color:#fff}
@media(max-width:1024px){.footer-grid{grid-template-columns:1fr 1fr 1fr}.footer-brand-col{grid-column:1/-1}}
@@ -152,7 +152,6 @@
<ul class="nav-links">
<li><a href="/#how">How it works</a></li>
<li><a href="/for-organisations/">For organisations</a></li>
<li><a href="/developer">Developers</a></li>
<li><a href="/resources/">Resources</a></li>
<li><a href="/about">About</a></li>
</ul>
@@ -201,9 +200,9 @@
<div class="group-label">Developer</div>
<div class="resource-list">
<a href="/developer/" class="resource-row">
<a href="/developer/openapi.json" class="resource-row">
<div class="resource-info">
<h3>API documentation</h3>
<h3>API documentation (OpenAPI spec)</h3>
<p>Full reference for the quiXzoom REST API. Authentication, endpoints, webhooks and rate limits.</p>
</div>
<span class="resource-tag">Docs</span>
@@ -301,8 +300,6 @@
<div>
<div class="footer-col-title">Developers</div>
<ul class="footer-col-links">
<li><a href="/developer">API overview</a></li>
<li><a href="/developer/#quickstart">Quick start</a></li>
<li><a href="/developer/openapi.json">OpenAPI spec</a></li>
<li><a href="/changelog">Changelog</a></li>
<li><a href="/status">System status</a></li>
@@ -327,7 +324,7 @@
<ul class="footer-col-links">
<li><a href="privacy/index.html">Privacy policy</a></li>
<li><a href="terms/index.html">Terms of service</a></li>
<li><a href="/terms#dac7">DAC7 reporting</a></li>
<li><a href="/terms#DAC7B2>DAC7 reporting</a></li>
<li><a href="/privacy#gdpr">GDPR rights</a></li>
<li><a href="/security#responsible">Responsible disclosure</a></li>
</ul>