Alur Kata Sandi OAuth2 dan Penerbitan Token
Terapkan skema OAuth2PasswordBearer, hash kata sandi dengan passlib, dan terbitkan token akses bertanda tangan saat masuk.
Alur Kata Sandi OAuth2 dan Penerbitan Token adalah pelajaran FastAPI Backend Development Bootcamp gratis di CoddyKit. Ini adalah pelajaran 1 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 FastAPI Backend Development Bootcamp, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus FastAPI Backend Development Bootcamp mencakup 4 pelajaran total.
Alur Kata Sandi OAuth2 dengan Bahasa Sederhana
Alur kata sandi OAuth2 (disebut juga pemberian Resource Owner Password Credentials) adalah cara paling sederhana untuk mengautentikasi klien pihak pertama: pengguna mengirim nama pengguna dan kata sandi langsung ke API Anda, lalu API mengembalikan token akses bertanda tangan.
- Klien mengirim kredensial satu kali ke endpoint
/token. - Server memverifikasi kredensial tersebut terhadap basis data.
- Jika berhasil, server mengembalikan token akses JWT yang berumur singkat.
- Setiap permintaan berikutnya membawa token tersebut dalam header
Authorization: Bearer <token>.
FastAPI menyediakan komponen siap pakai tepat untuk kebutuhan ini: OAuth2PasswordBearer dan OAuth2PasswordRequestForm.
Mendeklarasikan Skema OAuth2PasswordBearer
OAuth2PasswordBearer adalah dependensi FastAPI yang mengetahui cara mengambil token bearer dari header Authorization. Anda membuat satu instans dan mengarahkan tokenUrl ke endpoint login yang menerbitkan token.
tokenUrladalah jalur relatif — ini memberi tahu antarmuka dokumentasi tempat klien harus meminta token.- Menggunakan skema sebagai dependensi membuat endpoint mewajibkan token; header yang tidak ada atau formatnya salah akan secara otomatis menghasilkan 401.
from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
# 'token' matches the path of our login route below
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.get("/users/me")
async def read_me(token: str = Depends(oauth2_scheme)):
# FastAPI extracts the raw bearer token string for us
return {"token": token}Melakukan Hash pada Kata Sandi dengan passlib
Anda tidak boleh menyimpan kata sandi mentah. Lakukan hashing dengan algoritme kuat yang menggunakan salt. Pustaka passlib membungkus bcrypt melalui API CryptContext yang sederhana.
hash()menghasilkan intisari dengan salt yang Anda simpan di basis data.verify()membandingkan percobaan kata sandi teks biasa dengan hash yang tersimpan dalam waktu konstan.- bcrypt sengaja dibuat lambat sehingga serangan brute force menjadi lebih sulit.
from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def hash_password(plain: str) -> str:
return pwd_context.hash(plain)
def verify_password(plain: str, hashed: str) -> bool:
return pwd_context.verify(plain, hashed)
stored = hash_password("s3cret")
print("stored looks like:", stored[:7], "...")
print("correct ->", verify_password("s3cret", stored))
print("wrong ->", verify_password("nope", stored))Memodelkan Pengguna dan Basis Data Palsu Sederhana
Sebelum menerbitkan token, kita memerlukan tempat untuk mencari pengguna. Dalam produksi, tempat ini adalah basis data nyata Anda; untuk pembelajaran, kita menggunakan dict di memori. Perhatikan bahwa field yang disimpan adalah hashed_password, bukan teks biasa.
- Model Pydantic memberikan bentuk bertipe kepada pengguna.
- Helper
get_user()memusatkan proses pencarian.
from pydantic import BaseModel
class UserInDB(BaseModel):
username: str
hashed_password: str
disabled: bool = False
fake_users_db = {
"alice": UserInDB(
username="alice",
hashed_password="$2b$12$exampleexampleexamplehashvalue",
)
}
def get_user(username: str):
return fake_users_db.get(username)Mengautentikasi Kredensial
Autentikasi menghubungkan semua bagian: cari pengguna, lalu verifikasi kata sandi yang diberikan terhadap hash yang tersimpan. Kembalikan pengguna jika berhasil, atau nilai falsy jika gagal.
- Cari pengguna terlebih dahulu; jika tidak ada, gagalkan proses.
- Kemudian panggil
verify_password— jangan melakukan penghentian lebih awal sebelum hashing agar waktu pemrosesan tetap kurang lebih seragam. - Pemanggil menentukan cara memberikan respons (biasanya 401).
def authenticate_user(db, username: str, password: str):
user = db.get(username)
if not user:
return None
if not verify_password(password, user.hashed_password):
return None
return userApa Sebenarnya JWT Itu
JSON Web Token terdiri dari tiga segmen base64url yang digabungkan dengan titik: header.payload.signature.
- Header menyebutkan algoritme, misalnya
HS256. - Payload menyimpan klaim seperti
sub(subjek) danexp(kedaluwarsa). - Tanda tangan adalah HMAC dari header+payload menggunakan kunci rahasia Anda.
JWT ditandatangani, bukan dienkripsi — siapa pun dapat membaca payload, tetapi tidak ada yang dapat memalsukannya tanpa rahasia tersebut. Jangan pernah memasukkan kata sandi atau data sensitif ke dalam payload.
Menyandikan Token Akses Bertanda Tangan
Kita menandatangani token dengan pustaka python-jose (atau PyJWT). Selalu sertakan klaim exp agar token kedaluwarsa. Simpan nama pengguna dalam klaim sub — klaim ini mengidentifikasi pemilik token.
SECRET_KEYharus panjang, acak, dan tidak boleh disimpan dalam kendali versi.- Tetapkan masa berlaku singkat (misalnya 15–30 menit) untuk token akses.
from datetime import datetime, timedelta, timezone
from jose import jwt
SECRET_KEY = "replace-with-a-long-random-secret"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
def create_access_token(data: dict) -> str:
to_encode = data.copy()
expire = datetime.now(timezone.utc) + timedelta(
minutes=ACCESS_TOKEN_EXPIRE_MINUTES
)
to_encode.update({"exp": expire})
return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
token = create_access_token({"sub": "alice"})
print("issued token segments:", token.count(".") + 1)Bentuk Respons Token
Spesifikasi OAuth2 menentukan JSON yang dikembalikan endpoint /token. Minimal, respons tersebut harus menyertakan access_token dan token_type, dengan tipe berupa string literal "bearer".
- Klien membaca
token_typeuntuk mengetahui cara mengirim kembali kredensial tersebut. - Model Pydantic
Tokenmendokumentasikan dan memvalidasi respons.
from pydantic import BaseModel
class Token(BaseModel):
access_token: str
token_type: str
example = Token(access_token="eyJhbGci...", token_type="bearer")
print(example.model_dump())Menghubungkan Endpoint Login /token
Rute login bergantung pada OAuth2PasswordRequestForm, yang membaca field username dan password berkode formulir (bukan JSON) — tepat seperti yang diperlukan oleh alur kata sandi OAuth2. Jika berhasil, rute ini mengembalikan respons Token.
- Autentikasi yang gagal menghasilkan 401 dengan header
WWW-Authenticate: Bearer. - Klaim
submembawa nama pengguna ke dalam token.
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordRequestForm
app = FastAPI()
@app.post("/token", response_model=Token)
async def login(form: OAuth2PasswordRequestForm = Depends()):
user = authenticate_user(fake_users_db, form.username, form.password)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect username or password",
headers={"WWW-Authenticate": "Bearer"},
)
access_token = create_access_token({"sub": user.username})
return Token(access_token=access_token, token_type="bearer")Mendekode Token untuk Menemukan Pengguna Saat Ini
Rute yang dilindungi bergantung pada oauth2_scheme untuk menerima token mentah, lalu mendekodenya. Jika tanda tangan tidak valid atau token sudah kedaluwarsa, jwt.decode menghasilkan JWTError dan kita mengembalikan 401.
- Baca nama pengguna dari klaim
sub. - Muat kembali pengguna dari basis data untuk memastikan pengguna tersebut masih ada dan aktif.
from fastapi import Depends, HTTPException, status
from jose import JWTError, jwt
async def get_current_user(token: str = Depends(oauth2_scheme)):
credentials_exc = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username = payload.get("sub")
if username is None:
raise credentials_exc
except JWTError:
raise credentials_exc
user = get_user(username)
if user is None:
raise credentials_exc
return userPraktik Keamanan yang Penting
Mekanismenya sudah berjalan, tetapi penguatan untuk produksi membuatnya aman:
- Kunci rahasia: muat
SECRET_KEYdari variabel lingkungan; ganti kunci tersebut jika bocor. - Hanya HTTPS: token dalam header dikirim sebagai teks biasa melalui jaringan — TLS wajib digunakan.
- Kedaluwarsa singkat: batasi masa berlaku token akses dan pasangkan dengan token penyegaran yang berumur lebih panjang.
- Tetapkan algoritme: berikan daftar
algorithms=["HS256"]secara eksplisit kepadajwt.decodeuntuk memblokir seranganalg: none. - Error umum: tampilkan pesan "Nama pengguna atau kata sandi salah", jangan pernah mengungkapkan mana yang salah.
Pemeriksaan Singkat: Endpoint /token
Sekarang waktunya menguji pemahaman Anda tentang cara rute login FastAPI /token menggunakan kredensial.
Rangkuman: Dari Kata Sandi Menjadi Token Bearer
Anda telah menerapkan seluruh alur kata sandi OAuth2 di FastAPI:
- OAuth2PasswordBearer mendeklarasikan skema bearer dan mengambil token dari header
Authorization. - passlib + bcrypt melakukan hashing dan verifikasi kata sandi sehingga teks biasa tidak pernah disimpan.
- authenticate_user mencari pengguna dan memverifikasi hash, lalu mengembalikan 401 jika gagal.
- Rute /token membaca kredensial formulir melalui
OAuth2PasswordRequestFormdan menerbitkan JWT bertanda tangan dengan klaimsubserta masa kedaluwarsaexp. - get_current_user mendekode dan memvalidasi token, serta menetapkan algoritme untuk mencegah pemalsuan.
Dengan HTTPS, rahasia yang dimuat dari lingkungan, dan masa berlaku token yang singkat, ini menjadi dasar autentikasi yang kuat dan sesuai praktik umum.
Belajar FastAPI Backend Development Bootcamp dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 21
- Pelajaran
- 84
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Alur Kata Sandi OAuth2 dan Penerbitan Token” gratis?
Ya — teks lengkap “Alur Kata Sandi OAuth2 dan Penerbitan Token” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus FastAPI Backend Development Bootcamp, upgrade ke CoddyKit PRO. Kursus FastAPI Backend Development Bootcamp mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Alur Kata Sandi OAuth2 dan Penerbitan Token”?
Terapkan skema OAuth2PasswordBearer, hash kata sandi dengan passlib, dan terbitkan token akses bertanda tangan saat masuk. Kamu berlatih FastAPI Backend Development Bootcamp 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 FastAPI Backend Development Bootcamp?
Tidak diperlukan pengalaman sebelumnya. FastAPI Backend Development Bootcamp 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 1 dari 4.
Berapa lama pelajaran “Alur Kata Sandi OAuth2 dan Penerbitan Token” 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 FastAPI Backend Development Bootcamp ini?
Ya. Setiap pelajaran FastAPI Backend Development Bootcamp 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
- Alur Kata Sandi OAuth2 dan Penerbitan Token
- Menandatangani dan Memverifikasi JWT dengan python-jose
- Token Penyegaran dan Rotasi Token
- Otorisasi Berbasis Cakupan dan Pengawal Peran