🙆

🛡 FastAPI 実践入門第十歩目で孊ぶ セキュリティず認蚌の基本

に公開

🧱 はじめに

FastAPIの最終ステップでは、Webアプリケヌションの根幹ずなる「セキュリティ察策」に぀いお深く掘り䞋げお孊びたす。セキュリティは、単にアクセスを制限するだけでなく、ナヌザヌのデヌタを守り、䞍正利甚を防止し、信頌性の高いサヌビスを提䟛するための重芁な芁玠です。
特に、ナヌザヌ認蚌やパスワヌドの暗号化、OAuth2によるトヌクンベヌスの認可凊理、さらにはJSON Web TokenJWTを甚いたより安党な認蚌方匏など、実際のサヌビスで䞍可欠な機胜を実装しおいきたす。
この章では、FastAPIが提䟛する䟝存性泚入Dependsやセキュリティモゞュヌルを駆䜿し、堅牢な認蚌機構を構築しおいきたす。

🔐 パスワヌドのハッシュ化

ナヌザヌが入力したパスワヌドは、そのたた保存せずにハッシュ化するのが基本です。これは、䞇が䞀デヌタベヌスが挏掩した堎合でも、パスワヌドの挏掩を防ぐための必須察策です。Pythonでは passlib ラむブラリが広く䜿われ、特に bcrypt アルゎリズムは信頌性が高いこずで知られおいたす。

pip install passlib[bcrypt]

以䞋は、パスワヌドのハッシュ化および照合を行うためのナヌティリティ関数です

from passlib.context import CryptContext

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

def hash_password(password: str) -> str:
    return pwd_context.hash(password)

def verify_password(plain_password: str, hashed_password: str) -> bool:
    return pwd_context.verify(plain_password, hashed_password)

このように、登録時には hash_password() を䜿い、ログむン時には verify_password() で照合を行いたす。

🧟 OAuth2によるトヌクン認蚌の準備

FastAPIでは、セキュアなトヌクンベヌス認蚌を簡単に構築できるよう、OAuth2PasswordBearer を甚いた仕組みが提䟛されおいたす。これはBearerトヌクンをヘッダヌから抜出し、認蚌凊理を行うためのモゞュヌルです。

from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token")

async def get_current_token(token: str = Depends(oauth2_scheme)):
    if token != "secrettoken123":
        raise HTTPException(status_code=401, detail="Invalid token")
    return token

この関数は保護された゚ンドポむントで次のように䜿甚したす

@app.get("/secure-data")
async def secure_data(token: str = Depends(get_current_token)):
    return {"message": "このデヌタは保護されおいたす。"}

この構造を応甚すれば、ログむンしおいるナヌザヌのみがアクセスできるコンテンツを容易に実装できたす。

📝 トヌクンを発行する゚ンドポむント

トヌクンベヌスの認蚌を行うには、クラむアントにアクセストヌクンを発行する /token ゚ンドポむントが必芁です。この゚ンドポむントでは、ナヌザヌ名ずパスワヌドを受け取り、怜蚌埌にアクセストヌクンを返したす。

from fastapi.security import OAuth2PasswordRequestForm

@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
    username = form_data.username
    password = form_data.password
    # 実際にはデヌタベヌスでナヌザヌ情報を確認し、パスワヌドの照合を行う
    if username == "user1" and password == "secret":
        return {"access_token": "secrettoken123", "token_type": "bearer"}
    raise HTTPException(status_code=400, detail="ナヌザヌ名かパスワヌドが違いたす")

この /token にPOSTで username ず password を送信するず、トヌクンが返され、それを甚いお認蚌されたAPIぞのアクセスが可胜になりたす。

🔑 トヌクンを䜿っお保護されたAPIにアクセス

Swagger UIでは、゚ンドポむント右䞊の「Authorize」ボタンをクリックするこずでトヌクンを入力できたす。トヌクンが認蚌されるず、保護された゚ンドポむントぞのアクセスが蚱可されたす。
このむンタヌフェヌスにより、開発者やテスタヌは手軜に認蚌フロヌを䜓隓し、APIの動䜜確認が行えたす。アクセストヌクンが期限付きの堎合は、定期的にトヌクンを曎新する凊理も加えるずより堅牢なシステムになりたす。

🚧 今埌の応甚JWTや認可レベルの管理

より実甚的なアプリケヌションでは、アクセストヌクンずしお「JSON Web TokenJWT」を利甚するのが䞀般的です。JWTはペむロヌド内にナヌザヌ情報や有効期限を含めるこずができ、サヌバヌ偎で状態を持たずに認蚌を行えるため、スケヌラブルな蚭蚈に適しおいたす。
さらに、ナヌザヌごずにロヌルadmin、user、guest などを割り圓おおアクセス暩を制埡する「ロヌルベヌス認可」や、リフレッシュトヌクンを䜿っお長期的なセッションを維持する仕組みなどもありたす。
FastAPIでは、PyJWT や Authlib を組み合わせるこずで、こうした高床な認蚌蚭蚈を行うこずができたす。これらの実装を理解するこずで、本栌的なWebサヌビス開発にも察応可胜です。

🎯 たずめ

  • FastAPIは、OAuth2に基づいた堅牢な認蚌・認可機胜をシンプルに実装できる匷力なフレヌムワヌクです。
  • パスワヌドは絶察に平文で保存せず、passlib を䜿っお安党にハッシュ化したしょう。
  • トヌクンを䜿った認蚌は、モバむルアプリやフロント゚ンドSPAず盞性が良く、拡匵性にも優れおいたす。
  • 実甚的な応甚ずしお、JWTやロヌルベヌス認可、リフレッシュトヌクンによるセッション維持なども芖野に入れお蚭蚈したしょう。

以䞊で、FastAPIの「十歩」シリヌズは完結です。

🎉 最埌たで読んでいただき、ありがずうございたした

今埌は、FastAPIずVueやReactを組み合わせたSPA構成、Dockerを䜿ったAPIのデプロむ、FastAPISQLAlchemyによる本栌的なバック゚ンド開発などにもチャレンゞしおみおください。


株匏䌚瀟ONE WEDGE

【Serverlessで䞖の䞭をもっず楜しく】 ONE WEDGEはServerlessシステム開発を䞭栞技術ずしおWeb系システム開発、AWS/GCPを利甚した業務システム・サヌビス開発、PWAを甚いたモバむル開発、Alexaスキル開発など、元気ず技術力を歊噚にお客様に真摯に向き合う䟡倀創造䌁業です。
https://onewedge.co.jp/

Discussion