Otentikasi dasar di FastAPI

Saat Anda membuat API, keamanan sangatlah penting. Misalkan seorang penyerang menemukan jalannya ke API Anda, maka dalam kasus terburuk, dia dapat mengubah data Anda. Tentu saja Anda ingin menghindari hal itu setiap saat. Oleh karena itu, langkah pertama yang baik adalah menambahkan cara otentikasi yang sederhana.

Dengan nama pengguna dan kata sandi, Anda cukup mempersulit penyerang untuk mengakses aplikasi web Anda. Artikel ini akan mengajarkan Anda cara mengimplementasikan autentikasi dasar dengan FastAPI.

Akses Kredensial Dari Pengontrol

Jika Anda ingin mengamankan pengontrol lainnya, Anda harus menentukan skema keamanan. Ini sudah disediakan di FastAPI, menghemat waktu dan tenaga Anda. Tidak ada yang lebih rumit dari ini:

http_basic = fastapi.security.HTTPBasic()

Selanjutnya, Anda ingin melihat data pengguna. Pengguna API menentukan nama pengguna dan kata sandi dalam otentikasi dasar. Ini datang dalam sebuah objek, credentials. Kode di bawah ini menunjukkan bagaimana Anda dapat melihat kredensial:

@app.get("/books")
def find_all_books(credentials: HTTPBasicCredentials = fastapi.Depends(http_basic)) -> List[Book]:
    security_service.verify(credentials)
    return book_service.find_all()

Berikut adalah contoh kode yang menemukan daftar buku. Kredensial yang diberikan pengguna dapat diakses melalui parameter credentials.

security service akan memverifikasi kredensial. Jika ini salah, potongan kode ini menimbulkan kesalahan 401: tidak diotorisasi. Fungsi verifikasi layanan keamanan adalah metode penjaga. Jika tidak, alur eksekusi akan berlanjut dan mengembalikan daftar buku.

Cegah Kebocoran Informasi kepada Penyerang

Otentikasi dasar adalah cara mudah untuk mengamankan API. Kesalahan implementasi membuatnya rentan. Penyerang mengetahui cara kerja algoritme. Mereka menggunakan serangan yang ditargetkan untuk mengekstrak informasi.

Serangan paling signifikan yang harus Anda pertahankan adalah serangan brute force dan timing.

Cara terbaik untuk melindungi diri Anda dari serangan brute force di mana nama pengguna dan kata sandi dipilih secara acak adalah dengan memilih nama pengguna dan kata sandi yang panjang yang terdiri dari karakter, angka, dan simbol yang berbeda. Hal ini akan mempersulit pencurian kata sandi Anda.

Jangan pernah menyimpan kredensial dalam kode sumber. Menyimpannya dalam variabel lingkungan atau menggunakan layanan khusus seperti Azure Vault atau AWS KMS.

Seorang penyerang juga akan mencoba untuk mendapatkan setidaknya satu hak. Dia memotong pekerjaannya menjadi dua jika dia bisa mendapatkan nama pengguna atau kata sandinya. Jadi, jangan pernah memberi tahu pengguna apakah kata sandi atau nama penggunanya valid. Baik keduanya atau tidak sama sekali. Selain itu, saya menggabungkan nama pengguna dan kata sandi sebelum melakukan perbandingan. Dengan begitu, mereka diperlakukan sebagai satu kredensial.

Terakhir, kami menggunakan fungsi compare_digest dari modul secure untuk mencegah serangan timing, yang akan menunjukkan panjang kata sandi penyerang. Hasilnya ditunjukkan di bawah ini:

Kesimpulan

Di artikel ini, Anda telah mempelajari bahwa menambahkan autentikasi dasar di FastAPI itu mudah. Anda dapat membaca kredensial dan mulai memeriksanya. Jika pengguna tidak memberikan kredensial yang benar, Anda akan mengembalikan 401. Jika tidak, alur akan berlanjut.

Meskipun demikian, Anda harus memikirkan dengan hati-hati tentang cara menerapkan autentikasi dasar. Melalui kesalahan implementasi yang sederhana, Anda dapat membuat diri Anda sangat rentan terhadap penyerang. Jadi pastikan untuk mengambil tindakan tambahan jika Anda ingin lebih melindungi diri Anda sendiri.

Langkah wajar selanjutnya adalah metode autentikasi di mana Anda harus mengidentifikasi diri Anda menggunakan pihak ketiga seperti kartu identitas atau pengenalan wajah. Upaya keamanan tambahan ini akan mempersulit penyerang untuk mendapatkan akses ke API Anda.

Namun, untuk aplikasi yang tidak terlalu berisiko, cukup mengandalkan sesuatu seperti autentikasi dasar dan secara rutin melakukan pencadangan yang baik ke sistem yang terlindungi dengan baik di cloud.