For å sikre at applikasjonen vår beskytter brukerens data på best mulig måte, er det viktig å forstå hvordan man kan implementere to-faktor-autentisering (2FA) effektivt. 2FA gir et ekstra lag med sikkerhet ved at brukeren ikke bare må verifisere sitt passord, men også en sekundær faktor, vanligvis en engangskode som genereres av en autentiseringsapp. Dette kan hindre uautorisert tilgang, selv om noen får tak i brukerens passord. Her er en gjennomgang av hvordan 2FA fungerer i praksis og hvordan det kan implementeres i applikasjoner.

Når en bruker forsøker å logge inn, blir først passordet verifisert. Hvis passordet er korrekt, sjekkes om 2FA er aktivert for brukeren. Dersom det er aktivert, kreves det en engangskode som genereres av en TOTP (Time-based One-Time Password) applikasjon, for eksempel Google Authenticator eller Authy. Denne koden er kortvarig og kan kun brukes én gang. Hvis brukeren ikke kan oppgi en korrekt kode, blir påloggingen avvist, og en feilbeskjed vises.

Dersom en bruker forsøker å logge inn feil flere ganger, kan kontoen bli midlertidig låst for å beskytte mot brute-force angrep. Etter et forhåndsdefinert antall mislykkede forsøk, settes en låseperiode på for eksempel 10 minutter. Denne funksjonaliteten gir et ekstra lag med beskyttelse, og reduserer risikoen for at angripere kan gjette passord og 2FA-koder.

I et typisk scenario ser påloggingsprosessen slik ut:

  1. Brukeren aktiverer 2FA i innstillingene sine og skanner en QR-kode med autentiseringsappen.

  2. Backend verifiserer at 2FA-oppsettet er fullført ved å sjekke den første TOTP-koden.

  3. På fremtidige innlogginger, etter at passordet er verifisert, må brukeren oppgi en gyldig 6-sifret kode fra autentiseringsappen.

  4. Backend sjekker om kontoen er under lås og verifiserer 2FA-koden.

  5. Etter for mange mislykkede forsøk blir kontoen midlertidig låst, og brukeren får beskjed om å prøve igjen etter en viss tid.

Denne prosessen sørger for at påloggingen er både sikker og brukervennlig. Men 2FA alene er ikke nok. Det er også viktig å sikre at passordene lagres på en trygg måte. Derfor benyttes bcrypt for å hashe passordene før de lagres i databasen, noe som gjør det mye vanskeligere for uvedkommende å få tilgang til brukernes kontoinformasjon.

Videre er det avgjørende å ha mekanismer for å håndtere glemte passord og kontorettigheter. Ved glemte passord kan brukeren motta en sikker, tidsbegrenset lenke på e-post for å tilbakestille sitt passord. Dette bidrar til å opprettholde både sikkerhet og brukervennlighet i applikasjonen. Videre, med rollebasert tilgangskontroll, kan forskjellige brukere tildeles ulike rettigheter basert på deres rolle, noe som skaper en dynamisk og sikker tilgangskontroll i applikasjonen.

Noe av det viktigste som ikke må overses i implementeringen av et slikt autentiseringssystem, er balansen mellom sikkerhet og brukeropplevelse. Brukere som benytter 2FA kan oppleve frustrasjon dersom prosessen blir for tungvint eller tidkrevende. Derfor er det viktig å gjøre påloggingsprosessen så smidig som mulig, samtidig som man opprettholder et høyt sikkerhetsnivå. Det er også viktig å gi brukeren informasjon om hva som skjer underveis, slik at de er trygge på at deres konto er beskyttet, og at eventuelle feil kan rettes opp raskt.

En god praksis er å sørge for at brukeren får muligheten til å sette opp flere metoder for 2FA, som SMS, e-post eller autentiseringsapp, for å sikre at de alltid har en alternativ måte å logge inn på dersom en metode svikter. Dette øker påliteligheten og tilgjengeligheten av autentiseringssystemet.

I tillegg til sikkerhetsfunksjonene bør systemet også tilby profesjonelle tilbakemeldinger ved feil eller vellykkede pålogginger, for eksempel gjennom toast-varsler, som gir umiddelbar respons til brukeren om deres påloggingsstatus. Dette gjør opplevelsen både mer intuitiv og mindre frustrerende for sluttbrukeren.

Hvordan bygge en brukervennlig app med tilpassede feilmeldinger og temaer

I moderne webapplikasjoner er det viktig å håndtere både brukerfeil og systemfeil på en måte som ikke bare gir mening for brukeren, men også gir en god brukeropplevelse. Dette kan gjøres gjennom tilpassede feilmeldinger, varsler og visuelle tilpasninger som temaer. I denne delen ser vi på hvordan du kan håndtere feil effektivt i en FastAPI-applikasjon, samt hvordan du kan implementere funksjoner som tilpassede feilmeldinger og tema-bytte.

Feilhåndtering er en av de mest grunnleggende delene av enhver webapplikasjon. Når brukeren støter på en feil, er det viktig at applikasjonen gir en forståelig og informativ melding, slik at de kan forstå hva som gikk galt og hvordan de kan rette opp i problemet. FastAPI gir oss muligheten til å bruke tilpassede unntakshåndterere som kan returnere feilmeldinger til brukeren i et konsistent format.

For å starte, kan vi definere egne unntakshåndterere for vanlige HTTP-feil. For eksempel kan vi fange opp HTTP-feil som 404 (side ikke funnet), 403 (tilgang nektet), 401 (uforlikelig) og 500 (serverfeil) ved å bruke FastAPI’s exception_handler-funksjon. Dette kan gjøres med en enkel handler som returnerer en tilpasset feilmelding ved hjelp av Jinja2-maler:

python
from fastapi.templating import Jinja2Templates
from fastapi import FastAPI from starlette.exceptions import HTTPException as StarletteHTTPException from fastapi.exception_handlers import RequestValidationError from starlette.requests import Request app = FastAPI() templates = Jinja2Templates(directory="templates") @app.exception_handler(StarletteHTTPException) async def http_exception_handler(request: Request, exc: StarletteHTTPException): context = { "request": request, "code": exc.status_code, "message": { 404: "Page Not Found", 403: "Permission Denied", 401: "Unauthorized", 500: "Server Error" }.get(exc.status_code, "An error occurred"),
"detail": exc.detail if hasattr(exc, "detail") else ""
}
return templates.TemplateResponse("error.html", context, status_code=exc.status_code)

Når en feil oppstår, kan brukeren bli presentert med en HTML-side som forklarer hva som gikk galt, sammen med feilkoden og detaljene. For eksempel, en 404-feil kan vise at den etterspurte ressursen ikke ble funnet, og detaljene kan gi informasjon om hvilken spesifikk ressurs som mangler.

Feilbeskjeder kan også bli mer kontekstuelle og tilpasset applikasjonens funksjonalitet. Hvis en bruker prøver å få tilgang til en spesifikk ressurs som ikke finnes, kan du sende feilmeldingen som en del av unntaket:

python
from fastapi import HTTPException
@app.get("/user/{user_id}") def get_user(user_id: int): user = None # Forestill deg at vi henter brukeren fra en database if not user: raise HTTPException( status_code=404, detail=f"User with ID {user_id} not found" )

Denne tilnærmingen gir mer spesifikk informasjon til brukeren, og kan hjelpe med å gjøre feilmeldingene mer nyttige.

I tillegg til tradisjonelle feilmeldinger kan du forbedre brukeropplevelsen ved å bruke såkalte "toast notifications" i stedet for fullstendige feilsider. En toast notification er en kort, animert melding som vises kortvarig på skjermen. Dette er nyttig for små varsler, som suksessbeskjed eller valideringsfeil, som ikke krever en full sideinnlasting.

Her er et eksempel på hvordan du kan implementere en enkel toast-notifikasjon med JavaScript:

javascript
function showToast(message, timeout=3200) {
const toast = document.getElementById('toast'); toast.textContent = message; toast.style.display = "block";
setTimeout(() => { toast.style.display = "none"; }, timeout);
}

Dette kan være en mer diskret måte å informere brukeren om feil eller suksess, samtidig som applikasjonen forblir interaktiv og responsiv.

Videre kan du tilby en tematisk tilpasning av appens grensesnitt. Mange moderne applikasjoner tilbyr nå muligheten til å bytte mellom lys og mørk modus, som kan bidra til en mer personlig brukeropplevelse. Dette kan oppnås ved å bruke CSS variabler, også kjent som "custom properties". Dette gjør det mulig å bytte fargepalett raskt og uten å måtte laste inn siden på nytt.

Et enkelt eksempel på hvordan du kan implementere tema-bytte ved hjelp av JavaScript kan være som følger:

javascript
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme); } function getThemeFromCookie() {
const match = document.cookie.match(/theme=(light|dark)/);
return match ? match[1] : null; } function saveThemeToCookie(theme) { document.cookie = `theme=${theme}; path=/; max-age=31536000`; } function toggleTheme() { let current = document.documentElement.getAttribute('data-theme') || 'light';
let next = current === 'dark' ? 'light' : 'dark';
setTheme(next); saveThemeToCookie(next); } window.onload = function() { const cookieTheme = getThemeFromCookie(); setTheme(cookieTheme || 'light'); document.getElementById('theme-toggle').onclick = toggleTheme; };

Denne funksjonaliteten gir brukerne muligheten til å velge mellom forskjellige visuelle temaer, og appen vil huske deres preferanser ved hjelp av informasjonskapsler, selv når de besøker siden på nytt. Det er en enkel og effektiv måte å forbedre brukeropplevelsen på, spesielt for de som foretrekker mørk modus.

Som et ekstra trinn kan du også vurdere å integrere en server-side løsning for å håndtere brukerpreferanser, for eksempel ved å lagre temainnstillingene i en database knyttet til brukerens profil. Dette er nyttig hvis du har en autentiseringstjeneste på plass, og du ønsker å tilby en mer sømløs opplevelse på tvers av forskjellige enheter og sesjoner.

Slike forbedringer gjør applikasjonen mer robust, brukervennlig og tilpasset forskjellige brukermiljøer. Ved å implementere tilpassede feilmeldinger, varsler og temaer, kan du skape en applikasjon som føles både profesjonell og personlig.