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.