0Pricing
Python Academy · บทเรียน

การแทรกการพึ่งพาและการยืนยันตัวตน

ใช้ระบบ DI ของ FastAPI สำหรับตรรกะร่วมกันและการยืนยันตัวตนด้วย JWT

การแทรกการพึ่งพาและการยืนยันตัวตน เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

การฉีดการพึ่งพาคืออะไร

Depends() ของ FastAPI ช่วยให้คุณประกาศตรรกะที่ใช้ร่วมกัน เช่น เซสชันฐานข้อมูล การตรวจสอบสิทธิ์ และการกำหนดค่า ซึ่งจะถูกฉีดเข้าสู่ตัวจัดการเส้นทางโดยอัตโนมัติ

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")

ฟังก์ชันการพึ่งพา

การพึ่งพาคือสิ่งใด ๆ ที่เรียกใช้งานได้ อาจเป็นฟังก์ชัน คลาส หรือฟังก์ชันอื่นที่ใช้การพึ่งพา

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 params

การพึ่งพาแบบคลาส

ใช้คลาสเป็นการพึ่งพาเพื่อจัดกลุ่มการตั้งค่าที่เกี่ยวข้อง คลาสจะถูกเรียกใช้โดยฉีดอาร์กิวเมนต์ของ __init__ เข้าไป

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

ใช้ OAuth2PasswordBearer เพื่ออ่านโทเค็น Bearer จากส่วนหัว 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 here

โทเค็น JWT

สร้างและตรวจสอบโทเค็น JWT ด้วย python-jose (หรือ pyjwt) ส่งคืนโทเค็นเมื่อเข้าสู่ระบบ และตรวจสอบโทเค็นในทุกเส้นทางที่มีการป้องกัน

# 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])

การพึ่งพาผู้ใช้ปัจจุบัน

สร้างการพึ่งพา get_current_user ที่ตรวจสอบ JWT และส่งคืนผู้ใช้ที่ผ่านการยืนยันตัวตน

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 user

การแฮชรหัสผ่าน

อย่าเก็บรหัสผ่านแบบข้อความธรรมดา ใช้ passlib เพื่อแฮชด้วย 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)

จุดปลายทางโทเค็น

ใช้งาน POST /token เพื่อรับข้อมูลเข้าสู่ระบบจากฟอร์ม ตรวจสอบรหัสผ่าน และส่งคืน 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"}

การยืนยันตัวตนด้วยคีย์ API

สำหรับกรณีที่ไม่ซับซ้อน ให้ตรวจสอบคีย์ API จากส่วนหัวหรือพารามิเตอร์คำค้น

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 key

การควบคุมการเข้าถึงตามบทบาท

เพิ่มชั้นสิทธิ์เหนือการยืนยันตัวตนด้วยการเพิ่มการตรวจสอบบทบาทให้กับการพึ่งพา

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)):

การแคชการพึ่งพา

โดยค่าเริ่มต้น การพึ่งพาจะถูกเรียกหนึ่งครั้งต่อคำขอ และผลลัพธ์จะใช้ร่วมกันระหว่างเส้นทางทั้งหมดที่ใช้การพึ่งพานั้นในคำขอดังกล่าว

# 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
): ...

ตรวจสอบด่วน

Depends() ใน FastAPI ทำหน้าที่อะไร

สรุปทบทวน

ใช้ Depends(func) เพื่อฉีดตรรกะที่ใช้ร่วมกัน สร้างการยืนยันตัวตนด้วย OAuth2PasswordBearer โทเค็น JWT และ dependency get_current_user แฮชรหัสผ่านด้วย passlib/bcrypt และเพิ่มการตรวจสอบบทบาทเป็น dependency เพิ่มเติม

คำถามที่พบบ่อย

บทเรียน “การแทรกการพึ่งพาและการยืนยันตัวตน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแทรกการพึ่งพาและการยืนยันตัวตน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแทรกการพึ่งพาและการยืนยันตัวตน”

ใช้ระบบ DI ของ FastAPI สำหรับตรรกะร่วมกันและการยืนยันตัวตนด้วย JWT คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การแทรกการพึ่งพาและการยืนยันตัวตน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่าโปรเจกต์ FastAPI และเอนด์พอยต์แรก
  2. พารามิเตอร์เส้นทาง พารามิเตอร์คำค้น และบอดีคำขอ
  3. การแทรกการพึ่งพาและการยืนยันตัวตน
  4. เอนด์พอยต์อะซิงก์และการเชื่อมต่อฐานข้อมูล
← กลับไปที่ Python Academy