microdot.login — flux de connexion utilisateur#
Un wrapper de plus haut niveau autour de microdot.session qui implémente le flux de connexion conventionnel par nom d’utilisateur / mot de passe : une fonction de rappel user loader fait correspondre l’identifiant utilisateur stocké dans la session à l’objet utilisateur de l’application, des décorateurs de route redirigent les requêtes non authentifiées vers une URL de connexion configurable, et des cookies « se souvenir de moi » facultatifs permettent aux visiteurs de rester connectés d’une session de navigateur à l’autre.
Nécessite que microdot.session soit initialisé sur l’application avant la construction de l’objet de connexion – la session est l’endroit où l’identifiant utilisateur est stocké.
class Login#
- class microdot.login.Login(login_url: str = '/login')#
- login_url
URL vers laquelle le décorateur redirige les requêtes non authentifiées. L’application fournit le formulaire/gestionnaire de connexion réel à cette route. Par défaut
'/login'.
- user_loader(f)#
Décorateur qui enregistre la fonction de rappel de résolution d’utilisateur. f prend l’identifiant utilisateur stocké dans la session et renvoie l’objet utilisateur (ou
Nonesi l’identifiant n’est plus valide – un compte supprimé, une session révoquée, etc.).login = Login() @login.user_loader async def load_user(user_id): return users.get(user_id)
- __call__(f)#
Décorer une route avec l’instance
Loginla protège derrière une authentification@app.get('/dashboard') @login async def dashboard(request): user = request.g.current_user # ...
Les requêtes non authentifiées sont redirigées vers login_url avec un paramètre de requête
?next=<original-url>afin que le gestionnaire de connexion puisse renvoyer l’utilisateur là d’où il venait.
- fresh(f)#
Comme
__call__(), mais rejette les sessions restaurées depuis un cookie « se souvenir de moi » – l’utilisateur doit s’être connecté explicitement depuis la dernière connexion complète. Utilisé pour protéger les routes sensibles (changement de mot de passe, suppression de compte) afin qu’un cookie remember-me volé ne puisse pas les atteindre.
- async login_user(request, user, remember: bool | int = False, redirect_url: str = '/')#
Marque user comme connecté pour request. Stocke l’identifiant utilisateur dans la session et renvoie une réponse de redirection.
- user
L’objet utilisateur renvoyé par le user loader. Doit posséder un attribut
id.- remember
Si vrai, définit également un cookie
_rememberde longue durée. PassezTruepour les 30 jours par défaut, ou un entier pour le nombre de jours pendant lesquels le cookie doit durer.- redirect_url
Où rediriger après la connexion. Remplacé par
?next=<url>de la requête d’origine s’il pointe vers un chemin same-site.
Renvoie la réponse de redirection – renvoyez sa valeur depuis le gestionnaire de la route de connexion.
- async logout_user(request)#
Efface l’identifiant utilisateur de la session et supprime tout cookie
_remember. À utiliser depuis une route/logout@app.post('/logout') async def logout(request): await login.logout_user(request) return redirect('/')
- async get_current_user(request)#
Renvoie l’objet utilisateur actuellement connecté (ou
None). Mémorisé dansrequest.g.current_userafin que les appels répétés au sein d’une même requête n’atteignent le loader qu’une seule fois.
Exemple#
Un flux de connexion minimal
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('/')
Le cookie _remember est lui-même un JWT signé (à l’aide du secret de la session), de sorte qu’un cookie volé ne peut pas être réutilisé sur une application différente ni après que le secret a été renouvelé.