Injeksi Dependensi dan Autentikasi
Gunakan sistem DI FastAPI untuk logika bersama dan autentikasi berbasis JWT.
Injeksi Dependensi dan Autentikasi adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.
Apa Itu Injeksi Dependensi?
Depends() milik FastAPI memungkinkan Anda mendeklarasikan logika bersama (sesi basis data, pemeriksaan autentikasi, konfigurasi) yang secara otomatis disuntikkan ke penangan rute.
from fastapi import FastAPI, Depends
app = FastAPI()
def get_db():
db = connect_db()
try: yield db
finally: db.close()
@app.get("/users")
def list_users(db = Depends(get_db)):
return db.query_all("users")Fungsi Dependensi
Dependensi dapat berupa objek apa pun yang dapat dipanggil. Dependensi dapat berupa fungsi, kelas, atau fungsi lain yang menggunakan dependensi.
from fastapi import Depends, FastAPI
app = FastAPI()
def common_params(skip: int = 0, limit: int = 10):
return {"skip": skip, "limit": limit}
@app.get("/items")
def list_items(params: dict = Depends(common_params)):
return params
@app.get("/users")
def list_users(params: dict = Depends(common_params)):
return paramsDependensi Kelas
Gunakan kelas sebagai dependensi untuk mengelompokkan pengaturan yang berkaitan. Kelas tersebut dipanggil dengan argumen __init__-nya yang disuntikkan.
from fastapi import Depends, FastAPI, Query
app = FastAPI()
class Pagination:
def __init__(self, page: int = Query(1,ge=1), size: int = Query(10,ge=1,le=100)):
self.page = page
self.size = size
self.offset = (page - 1) * size
@app.get("/items")
def list_items(pag: Pagination = Depends()):
return {"offset": pag.offset, "size": pag.size}OAuth2 Password Bearer
Gunakan OAuth2PasswordBearer untuk membaca token Bearer dari header Authorization.
from fastapi import FastAPI, Depends
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
oauth2 = OAuth2PasswordBearer(tokenUrl="/token")
@app.get("/me")
def me(token: str = Depends(oauth2)):
return {"token": token} # validate token hereToken JWT
Buat dan verifikasi token JWT dengan python-jose (atau pyjwt). Kembalikan token saat login; verifikasi token tersebut di setiap rute yang dilindungi.
# pip install python-jose passlib
from jose import jwt, JWTError
SECRET_KEY = "change-me"
ALGORITHM = "HS256"
def create_token(data: dict) -> str:
return jwt.encode(data, SECRET_KEY, algorithm=ALGORITHM)
def verify_token(token: str) -> dict:
return jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])Dependensi Pengguna Saat Ini
Buat dependensi get_current_user yang memverifikasi JWT dan mengembalikan pengguna yang terautentikasi.
from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from jose import jwt, JWTError
oauth2 = OAuth2PasswordBearer(tokenUrl="/token")
def get_current_user(token: str = Depends(oauth2)):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
return payload["sub"]
except JWTError:
raise HTTPException(status_code=401, detail="Invalid token")
# @app.get("/me")
# def me(user=Depends(get_current_user)): return userHash Kata Sandi
Jangan pernah menyimpan kata sandi biasa. Gunakan passlib untuk melakukan hash dengan bcrypt.
from passlib.context import CryptContext
pwd_ctx = CryptContext(schemes=["bcrypt"], deprecated="auto")
def hash_pw(plain: str) -> str:
return pwd_ctx.hash(plain)
def verify_pw(plain: str, hashed: str) -> bool:
return pwd_ctx.verify(plain, hashed)Titik Akhir Token
Implementasikan POST /token yang menerima kredensial formulir, memverifikasi kata sandi, dan mengembalikan JWT.
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordRequestForm
app = FastAPI()
@app.post("/token")
def login(form: OAuth2PasswordRequestForm = Depends()):
user = get_user_by_username(form.username)
if not user or not verify_pw(form.password, user.hashed_pw):
raise HTTPException(status_code=401, detail="Bad credentials")
token = create_token({"sub": form.username})
return {"access_token": token, "token_type": "bearer"}Autentikasi Kunci API
Untuk kasus yang lebih sederhana, validasi kunci API dari header atau parameter kueri.
from fastapi import Depends, HTTPException, Security
from fastapi.security import APIKeyHeader
API_KEY_HEADER = APIKeyHeader(name="X-API-Key")
def require_api_key(key: str = Security(API_KEY_HEADER)):
if key != "secret-key":
raise HTTPException(status_code=403, detail="Forbidden")
return keyKontrol Akses Berbasis Peran
Tambahkan lapisan izin di atas autentikasi dengan menambahkan pemeriksaan peran ke dependensi.
from fastapi import Depends, HTTPException
def require_admin(user=Depends(get_current_user)):
if user.get("role") != "admin":
raise HTTPException(status_code=403, detail="Admins only")
return user
# @app.delete("/users/{uid}")
# def delete_user(uid: int, admin=Depends(require_admin)):Penyimpanan Cache Dependensi
Secara default, dependensi dipanggil sekali per permintaan dan hasilnya dibagikan kepada semua rute yang menggunakannya dalam permintaan tersebut.
# The same db session object is shared:
@app.get("/summary")
def summary(
db = Depends(get_db), # db resolved once
stats = Depends(get_stats) # get_stats also uses get_db — same db instance
): ...Pemeriksaan Singkat
Apa yang dilakukan Depends() di FastAPI?
Ringkasan
Gunakan Depends(func) untuk menyuntikkan logika bersama. Bangun autentikasi dengan OAuth2PasswordBearer, token JWT, dan dependensi get_current_user. Hash kata sandi dengan passlib/bcrypt. Tambahkan pemeriksaan peran sebagai dependensi lanjutan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Injeksi Dependensi dan Autentikasi” gratis?
Ya — teks lengkap “Injeksi Dependensi dan Autentikasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Injeksi Dependensi dan Autentikasi”?
Gunakan sistem DI FastAPI untuk logika bersama dan autentikasi berbasis JWT. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Python Academy?
Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Injeksi Dependensi dan Autentikasi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?
Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Penyiapan Proyek FastAPI dan Endpoint Pertama
- Parameter Jalur, Parameter Kueri, dan Body Permintaan
- Injeksi Dependensi dan Autentikasi
- Endpoint Asinkron dan Integrasi Database