microdot.login — användarinloggningsflöde

En omslutning på högre nivå kring microdot.session som implementerar det konventionella inloggningsflödet med användarnamn/lösenord: ett återanrop för användarladdning mappar sessionens lagrade användar-id tillbaka till applikationens användarobjekt, rutt-dekoratorer omdirigerar oautentiserade begäranden till en konfigurerbar inloggnings-URL, och valfria ”kom ihåg mig”-cookies låter återkommande besökare förbli inloggade över webbläsarsessioner.

Kräver att microdot.session initieras på applikationen innan login-objektet konstrueras – sessionen är där användar-id lagras.

class Login

class microdot.login.Login(login_url: str = '/login')
login_url

URL som dekoratorn omdirigerar oautentiserade begäranden till. Applikationen tillhandahåller det faktiska inloggningsformuläret/hanteraren på denna rutt. Standard '/login'.

user_loader(f)

Dekorator som registrerar återanropet för användaruppslagning. f tar användar-id som lagrats i sessionen och returnerar användarobjektet (eller None om id:t inte längre är giltigt – ett raderat konto, en återkallad session osv.).

login = Login()

@login.user_loader
async def load_user(user_id):
    return users.get(user_id)
__call__(f)

Att dekorera en rutt med Login-instansen spärrar den bakom autentisering:

@app.get('/dashboard')
@login
async def dashboard(request):
    user = request.g.current_user
    # ...

Oautentiserade begäranden omdirigeras till login_url med en frågeparameter ?next=<original-url> så att inloggningshanteraren kan skicka tillbaka användaren dit den kom ifrån.

fresh(f)

Som __call__(), men avvisar sessioner som återställts från en ”kom ihåg mig”-cookie – användaren måste ha loggat in uttryckligen sedan den senaste fullständiga inloggningen. Används för att spärra känsliga rutter (lösenordsbyte, kontoradering) så att en stulen kom-ihåg-mig-cookie inte kan nå dem.

async login_user(request, user, remember: bool | int = False, redirect_url: str = '/')

Markera user som inloggad för request. Lagrar användar-id i sessionen och returnerar ett omdirigeringssvar.

user

Användarobjektet som returneras av användarladdaren. Måste ha ett id-attribut.

remember

Om sant, sätt också en långlivad _remember-cookie. Skicka True för standardvärdet 30 dagar, eller ett heltal för antalet dagar cookien ska vara giltig.

redirect_url

Vart omdirigeringen ska ske efter inloggning. Åsidosätts av ?next=<url> från den ursprungliga begäran om den pekar på en sökväg på samma webbplats.

Returnerar omdirigeringssvaret – returnera dess värde från inloggningsruttens hanterare.

async logout_user(request)

Rensa användar-id från sessionen och ta bort eventuell _remember-cookie. Använd från en /logout-rutt:

@app.post('/logout')
async def logout(request):
    await login.logout_user(request)
    return redirect('/')
async get_current_user(request)

Returnera det för närvarande inloggade användarobjektet (eller None). Memoiserat på request.g.current_user så att upprepade anrop inom en begäran träffar laddaren endast en gång.

Exempel

Ett minimalt inloggningsflöde:

from microdot import Microdot, redirect
from microdot.session import Session
from microdot.login import Login

app = Microdot()
Session(app, secret_key=load_secret())
login = Login()

@login.user_loader
async def load_user(user_id):
    return users.get(user_id)

@app.get('/login')
async def login_page(request):
    return Response.send_file('static/login.html')

@app.post('/login')
async def do_login(request):
    user = authenticate(request.form['user'], request.form['pass'])
    if not user:
        return redirect('/login?error=1')
    return await login.login_user(request, user, remember=True)

@app.get('/dashboard')
@login
async def dashboard(request):
    return 'hi ' + request.g.current_user.name

@app.post('/logout')
async def logout(request):
    await login.logout_user(request)
    return redirect('/')

_remember-cookien är själv en signerad JWT (med sessionens hemlighet), så en stulen cookie kan inte återanvändas på en annan applikation eller efter att hemligheten har roterats.