Lewati ke isi

Autentikasi

Starlette menyediakan antarmuka yang sederhana namun kuat untuk menangani otentikasi dan izin. Setelah Anda menginstal backend otentikasi yang sesuai AuthenticationMiddleware , request.user dan request.auth Antarmuka akan tersedia di titik akhir Anda.

Starlette.application diimpor dari Starlette
Dari impor starlette.authentication (
    Otendensial, AuthenticationBackend, Otentikasi Kesalahan, SimpleUser
)
Impor Middleware dari starlette.middleware
Dari starlette.middleware.authentication impor AuthenticationMiddleware
Dari pemula. Tanggapan impor PlainTextResponse
Dari bintang. rute impor routing
Base64 impor
Impor binascii


Kelas BasicAuthBackend (AuthenticationBackend):
    Async def authenticate (diri, conn):
        Jika "Otorisasi" tidak dalam conn.headers:
            Kembali

        Auth = conn.headers ["Otorisasi"]
        Coba:
            Skema, kredensial = auth.split ()
            Jika rencananya lebih rendah ()! = 'dasar':
                Kembali
            Dikodekan = base64.b64decode (kredensial).decode ("ascii")
        Kecuali (ValueError, UnicodeDecodeError, binascii. Error) sebagai exc:
            Tingkatkan Kesalahan Otentikasi ('Kredensial auth dasar tidak valid')

        Nama pengguna, _, password = decoded.partisi (":")
        # TODO: Anda ingin memverifikasi nama pengguna dan kata sandi di sini.
        Kembalikan Otendensial (["diautentikasi"]), Pengguna Sederhana (nama pengguna)


Sinkronisasi beranda def (permintaan):
    Jika permintaan.user.user _ autentikasi:
        Kembali PlainTextResponse ('Halo,' + request.user. tampilan _ nama)
    Kembalinya PlainTextResponse ('Halo, kamu')

Rute = [
    Rute ("/," titik akhir = beranda)
]

Peralatan Tengah = [
    Middleware (AuthenticationMiddleware, backend=BasicAuthBackend ())
]

App = Starlette (rute = rute, middleware=middleware)

pengguna

Setelah instalasi AuthenticationMiddleware selesai, antarmuka request.user akan tersedia untuk digunakan dengan endpoint atau middleware lainnya.

Antarmuka ini harus mewarisi subkelas BaseUser yang menyediakan dua properti, serta informasi lain yang terkandung dalam model pengguna Anda.

  • .is_authenticated
  • .display_name

Starlette menyediakan dua implementasi pengguna bawaan:UnauthenticatedUser() dan SimpleUser(username).

kredensial otentikasi

Yang penting, kredensial otentikasi harus diperlakukan sebagai konsep terpisah dari pengguna. Skema otentikasi harus dapat membatasi atau memberikan izin khusus secara independen dari identitas pengguna.

Kelas AuthCredentials menyediakan antarmuka dasar yang diekspos oleh request.auth:

  • .scopes

izin

Izin diimplementasikan sebagai dekorator titik akhir untuk memaksa permintaan masuk untuk menyertakan ruang lingkup otentikasi yang diperlukan.

Dari pemula. Impor otentikasi membutuhkan


@ membutuhkan ('diautentikasi')
Async dasbor def (permintaan):
    ...

Anda dapat menyertakan satu atau lebih rentang yang diperlukan:

Dari pemula. Impor otentikasi membutuhkan


@ membutuhkan (['diautentikasi', 'admin'])
Async dasbor def (permintaan):
    ...

Secara default, respons 403 dikembalikan ketika tidak ada izin yang diberikan. Dalam beberapa kasus, Anda mungkin ingin menyesuaikan ini, seperti menyembunyikan informasi tentang tata letak URL dari pengguna yang tidak diautentikasi.

Dari pemula. Impor otentikasi membutuhkan


@ membutuhkan (['diautentikasi', 'admin'], status _ code = 404)
Async dasbor def (permintaan):
    ...

!!! Perhatikan bahwa WebSockets tidak mendukung parameter status_code. Untuk kasus ini, kode status 403 (dilarang) akan selalu digunakan.

Atau Anda mungkin ingin mengarahkan kemba*guna yang tidak diautentikasi ke halaman lain.

Dari pemula. Impor otentikasi membutuhkan


Sinkronisasi beranda def (permintaan):
    ...


@ membutuhkan ('diautentikasi', dialihkan = 'beranda')
Async dasbor def (permintaan):
    ...

Saat mengarahkan pengguna, halaman yang Anda arahkan untuk menyertakan URL yang awalnya mereka minta dalam parameter kueri next:

Dari pemula. Impor otentikasi membutuhkan
Tanggapan langsung diimpor dari starlette.responses


@ membutuhkan ('autentikasi', redirect = 'login')
Async def admin (permintaan):
    ...


Async def login (permintaan):
    Jika permintaan.metode = = "POST":
        # Sekarang pengguna telah diautentikasi,
        # kami dapat mengirim mereka ke tujuan permintaan awal mereka
        Jika permintaan.user.user _ autentikasi:
            next _ url = request.query _ params get ("next")
            Jika selanjutnya _ url:
                Respon Langsung Kembali (next _ url)
            Kembali RedirectResponse ("/")

Untuk titik akhir berbasis kelas, Anda harus membungkus dekorator dengan metode kelas.

Dari pemula. Impor otentikasi membutuhkan
Dari starlette.endpoints impor HTTPEndpoint


Dasbor Kelas (HTTPEndpoint):
    @ membutuhkan ("diautentikasi")
    Aync pasti mendapatkan (diri, permintaan):
        ...

Respon kesalahan otentikasi khusus

Anda dapat menyesuaikan respons kesalahan yang di kirim saat backend otentikasi melempar AuthenticationError:

Starlette.application diimpor dari Starlette
Impor Middleware dari starlette.middleware
Dari starlette.middleware.authentication impor AuthenticationMiddleware
Dari bintang. permintaan permintaan impor
Dari pemula. Tanggapan impor JSONResponse


Def on _ auth _ error (permintaan: Permintaan, exc: Exception):
    Kembalikan JSONResponse ({"error": str(exc)}, status _ code = 401)

Aplikasi = Starlette (
    Peralatan Tengah = [
        Middleware (AuthenticationMiddleware, backend=BasicAuthBackend (), on _ error = on _ auth _ error),
    ],
)