Hoppa till innehåll

Uppdrag

Åldersverifierad obemannad handel — från BankID till fysisk upplåsning

En plattform som spärrar åldersreglerade varuautomater bakom svenskt BankID: kunden skannar en QR-kod, verifierar sin ålder och maskinen låses upp fysiskt. Adminkonsol, kioskflotta och mobilflöde — ett och samma API.

.NET 8 · Blazor WebAssembly · Electron · Raspberry Pi · SignalR · Azure SQL
Sammanhang
Svensk lag begränsar vem som får köpa vissa varor. En obemannad varuautomat har ingen kassör som kontrollerar legitimation — att sälja åldersreglerade varor genom en kräver därför en verifiering minst lika stark som en mänsklig kontroll, med bevis på att den skett.
Problem
Koppla en juridiskt giltig identitetskontroll till ett fysiskt lås: från en QR-skanning i kundens mobil, via BankID-verifiering av ålder, till en reläpuls som öppnar exakt en maskin — och inget annat.
Förutsättningar
Hårdvara i fält på mobilnät: kioskerna måste vara offline-first och kunna uppdateras på distans utan platsbesök. En QR-kod får inte gå att vidarebefordra till någon som står någon annanstans. Varje upplåsning kräver ett revisionsspår.
Roll
Ensam utvecklare genom tre större plattformsversioner — API, adminkonsol, kioskklient och mobilflöde.
Arkitektur
Ett ASP.NET Core-API som betjänar tre ytor: en Blazor WebAssembly-konsol där operatörer hanterar maskiner, GPIO-konfiguration och flottans hälsa; offline-first Electron-kiosker på Raspberry Pi som reagerar på SignalR-kommandon; och en anonym, GPS-spärrad mobilsida för upplåsning. BankID-verifieringen går genom en certifierad identitetsgateway; vid godkänt skickar backend ett upplåsningskommando över SignalR som pulserar ett GPIO-relä. Azure SQL bär revisionsspåret; kioskernas automatiska uppdateringar levereras från blob-lagring med SHA-256-verifiering.
Vägval
En GPS-närhetsspärr — mobilen måste befinna sig inom några meter från maskinen innan en verifieringssession startar, så att QR-koder inte kan delas på distans. JWT per maskin med tyst förnyelse i stället för delade enhetsnycklar. Signerade, hashverifierade automatiska uppdateringar så att flottan lagas utan platsbesök. Pulsmönstren är konfigurerbara per maskin, eftersom verklig automathårdvara inte är överens om vad en ”upplåsningssignal” är.
Utfall
Tre större plattformsversioner levererade; den tredje samlade adminkonsol, kioskflotta och mobil upplåsning under ett enda API. Flottans storlek och användningssiffror tillhör operatören och publiceras inte här.
Underlag
Privata kodbaser; ensamt upphov verifierbart i commithistoriken genom alla versioner. Referenser lämnas på begäran.
Sekretess
Beskriven endast på domännivå — plattformen och dess operatör namnges inte här.