microdot.login — käyttäjän kirjautumisvirta

Korkeamman tason kääre moduulin microdot.session ympärille, joka toteuttaa tavanomaisen käyttäjänimi/salasana-kirjautumisvirran: käyttäjän lataaja -takaisinkutsu yhdistää istuntoon tallennetun käyttäjätunnuksen takaisin sovelluksen käyttäjäobjektiin, reittidekoraattorit ohjaavat todentamattomat pyynnöt konfiguroitavaan kirjautumis-URL-osoitteeseen, ja valinnaiset ”muista minut” -evästeet antavat palaavien kävijöiden pysyä kirjautuneina selainistuntojen yli.

Vaatii, että microdot.session on alustettu sovelluksessa ennen kirjautumisobjektin rakentamista – käyttäjätunnus tallennetaan istuntoon.

class Login

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

URL-osoite, johon dekoraattori ohjaa todentamattomat pyynnöt. Sovellus tarjoaa varsinaisen kirjautumislomakkeen/käsittelijän tässä reitissä. Oletus '/login'.

user_loader(f)

Dekoraattori, joka rekisteröi käyttäjän selvittävän takaisinkutsun. f ottaa istuntoon tallennetun käyttäjätunnuksen ja palauttaa käyttäjäobjektin (tai None, jos tunnus ei ole enää kelvollinen – poistettu tili, peruutettu istunto tms.).

login = Login()

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

Reitin dekorointi Login-instanssilla suojaa sen todennuksen taakse:

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

Todentamattomat pyynnöt ohjataan osoitteeseen login_url hakuparametrilla ?next=<original-url>, jotta kirjautumiskäsittelijä voi lähettää käyttäjän takaisin sinne, mistä hän tuli.

fresh(f)

Kuten __call__(), mutta hylkää ”muista minut” -evästeestä palautetut istunnot – käyttäjän on täytynyt kirjautua nimenomaisesti sisään edellisen täyden kirjautumisen jälkeen. Käytetään herkkien reittien (salasanan vaihto, tilin poisto) suojaamiseen, jotta varastettu muista minut -eväste ei pääse niihin käsiksi.

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

Merkitsee käyttäjän user kirjautuneeksi pyyntöä request varten. Tallentaa käyttäjätunnuksen istuntoon ja palauttaa uudelleenohjausvastauksen.

user

Käyttäjän lataajan palauttama käyttäjäobjekti. Sillä on oltava id-attribuutti.

remember

Jos tosi, asettaa myös pitkäikäisen _remember-evästeen. Anna True oletuksena olevia 30 päivää varten tai kokonaisluku evästeen kestopäivien määränä.

redirect_url

Minne ohjataan kirjautumisen jälkeen. Alkuperäisen pyynnön ?next=<url> ohittaa tämän, jos se osoittaa saman sivuston polkuun.

Palauttaa uudelleenohjausvastauksen – palauta sen arvo kirjautumisreitin käsittelijästä.

async logout_user(request)

Tyhjentää käyttäjätunnuksen istunnosta ja poistaa mahdollisen _remember-evästeen. Käytä /logout-reitistä:

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

Palauttaa tällä hetkellä kirjautuneena olevan käyttäjäobjektin (tai None). Muistitallennettu kohteeseen request.g.current_user, joten toistuvat kutsut yhden pyynnön sisällä osuvat lataajaan vain kerran.

Esimerkki

Minimaalinen kirjautumisvirta:

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-eväste on itsessään allekirjoitettu JWT (istunnon salaisuutta käyttäen), joten varastettua evästettä ei voi käyttää uudelleen eri sovelluksessa tai sen jälkeen, kun salaisuus on vaihdettu.