microdot.login — kullanıcı oturum açma akışı

microdot.session üzerine, geleneksel kullanıcı adı / parola oturum açma akışını uygulayan daha üst düzey bir sarmalayıcı: bir user loader geri çağırması, oturumda saklanan kullanıcı kimliğini uygulamanın kullanıcı nesnesine geri eşler, rota dekoratörleri kimliği doğrulanmamış istekleri yapılandırılabilir bir oturum açma URL’sine yönlendirir ve isteğe bağlı “beni hatırla” çerezleri, geri dönen ziyaretçilerin tarayıcı oturumları arasında oturumlarını açık tutmasını sağlar.

Login nesnesi oluşturulmadan önce uygulamada microdot.session modülünün başlatılmış olmasını gerektirir – kullanıcı kimliği oturumda saklanır.

class Login

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

Dekoratörün kimliği doğrulanmamış istekleri yönlendirdiği URL. Uygulama, gerçek oturum açma formunu/işleyicisini bu rotada sağlar. Varsayılan '/login'.

user_loader(f)

Kullanıcı çözümleyici geri çağırmasını kaydeden dekoratör. f, oturumda saklanan kullanıcı kimliğini alır ve kullanıcı nesnesini döndürür (veya kimlik artık geçerli değilse None – silinmiş bir hesap, iptal edilmiş bir oturum vb.).

login = Login()

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

Bir rotayı Login örneğiyle dekore etmek onu kimlik doğrulamasının arkasına alır:

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

Kimliği doğrulanmamış istekler, oturum açma işleyicisinin kullanıcıyı geldiği yere geri gönderebilmesi için ?next=<original-url> sorgu parametresiyle birlikte login_url adresine yönlendirilir.

fresh(f)

Tıpkı __call__() gibi, ancak bir “beni hatırla” çerezinden geri yüklenen oturumları reddeder – kullanıcının son tam oturum açmadan bu yana açıkça oturum açmış olması gerekir. Çalınmış bir beni-hatırla çerezinin ulaşamaması için hassas rotaları (parola değiştirme, hesap silme) korumak amacıyla kullanılır.

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

request için user öğesini oturum açmış olarak işaretler. Kullanıcı kimliğini oturumda saklar ve bir yönlendirme yanıtı döndürür.

user

Kullanıcı yükleyici tarafından döndürülen kullanıcı nesnesi. Bir id özniteliğine sahip olmalıdır.

remember

Doğru ise, ek olarak uzun ömürlü bir _remember çerezi de ayarlar. Varsayılan 30 gün için True, veya çerezin kaç gün süreceğini belirtmek için bir tam sayı geçirin.

redirect_url

Oturum açtıktan sonra nereye yönlendirileceği. Orijinal istekten gelen ?next=<url> aynı siteye ait bir yolu işaret ediyorsa onun tarafından geçersiz kılınır.

Yönlendirme yanıtını döndürür – değerini oturum açma rota işleyicisinden döndürün.

async logout_user(request)

Kullanıcı kimliğini oturumdan temizler ve varsa _remember çerezini kaldırır. Bir /logout rotasından kullanın:

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

O anda oturum açmış olan kullanıcı nesnesini (veya None) döndürür. request.g.current_user üzerinde belleğe alınır; böylece tek bir istek içindeki tekrarlanan çağrılar yükleyiciye yalnızca bir kez ulaşır.

Örnek

Minimal bir oturum açma akışı:

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 çerezinin kendisi imzalı bir JWT’dir (oturumun gizli anahtarını kullanır); böylece çalınmış bir çerez farklı bir uygulamada veya gizli anahtar döndürüldükten sonra yeniden kullanılamaz.