microdot.login --- Alur login pengguna

Pembungkus tingkat lebih tinggi di sekitar microdot.session yang mengimplementasikan alur login nama pengguna / kata sandi konvensional: callback user loader memetakan id-pengguna tersimpan dari sesi kembali ke objek pengguna aplikasi, dekorator rute mengalihkan permintaan yang tidak terautentikasi ke URL login yang dapat dikonfigurasi, dan cookie "ingat saya" opsional memungkinkan pengunjung yang kembali tetap masuk di seluruh sesi browser.

Membutuhkan microdot.session untuk diinisialisasi pada aplikasi sebelum objek login dibuat -- sesi adalah tempat id-pengguna disimpan.

class Login

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

URL tempat dekorator mengalihkan permintaan yang tidak terautentikasi. Aplikasi menyediakan form/handler login yang sebenarnya di rute ini. Default '/login'.

user_loader(f)

Dekorator yang mendaftarkan callback pemecah-pengguna. f menerima id-pengguna yang tersimpan dalam sesi dan mengembalikan objek pengguna (atau None jika id tidak lagi valid -- akun yang dihapus, sesi yang dicabut, dll.).

login = Login()

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

Mendekorasi rute dengan instans Login akan melindunginya di balik autentikasi:

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

Permintaan yang tidak terautentikasi dialihkan ke login_url dengan parameter kueri ?next=<original-url> agar handler login dapat mengirim pengguna kembali ke tempat mereka berasal.

fresh(f)

Seperti __call__(), tetapi menolak sesi yang dipulihkan dari cookie "ingat saya" -- pengguna harus telah login secara eksplisit sejak login penuh terakhir. Digunakan untuk melindungi rute sensitif (perubahan kata sandi, penghapusan akun) agar cookie ingat-saya yang dicuri tidak dapat menjangkaunya.

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

Tandai user sebagai sudah login untuk request. Menyimpan id pengguna dalam sesi dan mengembalikan respons pengalihan.

user

Objek pengguna yang dikembalikan oleh user loader. Harus memiliki atribut id.

remember

Jika bernilai benar, juga setel cookie _remember yang berumur panjang. Berikan True untuk default 30 hari, atau bilangan bulat untuk jumlah hari cookie harus bertahan.

redirect_url

Ke mana harus dialihkan setelah login. Ditimpa oleh ?next=<url> dari permintaan asli jika menunjuk ke jalur situs yang sama.

Mengembalikan respons pengalihan -- kembalikan nilainya dari handler rute login.

async logout_user(request)

Hapus id pengguna dari sesi dan hapus cookie _remember apa pun. Gunakan dari rute /logout

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

Kembalikan objek pengguna yang sedang login (atau None). Di-memo pada request.g.current_user sehingga panggilan berulang dalam satu permintaan hanya menyentuh loader sekali.

Contoh

Alur login 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('/')

Cookie _remember itu sendiri adalah JWT yang ditandatangani (menggunakan rahasia sesi), sehingga cookie yang dicuri tidak dapat digunakan kembali pada aplikasi yang berbeda atau setelah rahasia dirotasi.