説明を使用した承認と認証Fastapiをセットアップする方法
OAUTH2とJWTを使用して、FASTAPIで認証と認証を設定するための段階的なガイドを次に示します。
コードを個別のファイルに整理することから始めましょう。
まず、Pydantic ModelsのModels.pyという新しいファイルを作成します。

models.py：
`` `
Pydantic Import Basemodelから

クラスユーザー（BASEMODEL）：
    ユーザー名：str
    電子メール：str
    hashed_password：str

クラストークン（BaseModel）：
    Access_Token：str
    token_type：str
`` `
次に、依存関係関数のためにdependencies.pyという別の新しいファイルを作成します。

依存関係者：
`` `
Fastapiからインポートは、httpexception、ステータスに依存します
Fastapi.security Import oauth2passwordbearerから
JWTEROR、JOSE Import JWTから
インポートの入力オプションから
OSをインポートします
秘密をインポートします

モデルからインポートユーザーから
utils Import get_userから、verify_password

secret_key = os.getenv（ "secret_key"、default = secrets.token_hex（32））
algorithm = "HS256"

oauth2_scheme = oauth2passwordbearer（tokenurl = "token"）

async def get_current_user（token：str = depend（oauth2_scheme））：
    credentials_exception = httpexception（
        status_code = status.http_401_unauthorized、
        詳細= "資格情報を検証できませんでした"、
        headers = {"www-authenticate"： "Bearer"}、
    ））
    試す：
        ペイロード= jwt.decode（token、secret_key、algorithms = [algorithm]）
        ユーザー名：str = payload.get（ "sub"）
        ユーザー名がなしである場合：
            資格情報を上げます
        token_data = {"username"：username}
    jwterrorを除く：
        資格情報を上げます

    user = get_user（fake_users_db、username = token_data ["username"]）
    ユーザーがいない場合：
        資格情報を上げます
    ユーザーを返します
`` `
次に、ユーティリティ関数用のutils.pyという新しいファイルを作成します。

utils.py：
`` `
Passlib.ContextからCryptContextをインポートします
Jose Import JWTから
DateTime Import DateTimeから、Timedeltaから
モデルからインポートユーザーから

pwd_context = cryptcontext（schemes = ["bcrypt"]、deprecated = "auto"）

def verify_password（plain_password、hashed_password）：
    pwd_context.verifyを返す（plain_password、hashed_password）

def get_user（db、username：str）：
    dbのユーザー名の場合：
        user_dict = db [username]
        returnユーザー（** user_dict）

def authenticate_user（fake_db、username：str、password：str）：
    user = get_user（fake_db、username）
    ユーザーではない場合：
        falseを返します
    verify_password（password、user.hashed_password）でない場合：
        falseを返します
    ユーザーを返します

def create_access_token（data：dict、expires_delta：timedelta = none）：
    to_encode = data.copy（）
    expires_deltaの場合：
        期限切れ= datetime.utcnow（） + expires_delta
    それ以外：
        期限切れ= dateTime.utcnow（） + timedelta（分= 15）
    to_encode.update（{"exp"：期限切れ}）
    encoded_jwt = jwt.encode（to_encode、secret_key、algorithm = algorithm）
    encoded_jwtを返します
`` `
次に、main.pyでは、これらのモジュールをインポートし、重複コードを削除します。

main.py：
`` `
Fastapi Import Fastapi、依存、httpexception、ステータスから
Fastapi.securityインポートoauth2passwordrequestformから
DateTime Import Timedeltaから
Passlib.ContextからCryptContextをインポートします
秘密をインポートします

モデルからインポートユーザー、トークンから
依存関係からoauth2_scheme、get_current_userをインポートします
utilsからimport exhingicate_user、create_access_token、get_user

app = fastapi（）

Access_TOKEN_EXPIRE_MINUTES = 30

＃偽のユーザーDB
fake_users_db = {
    "ジョン・ドウ"： {
        「ユーザー名」：「ジョンドー」、
        「電子メール」：「johndoe@example.com」、
        "hashed_password"：cryptcontext（schemes = ["bcrypt"]、deprecated = "auto"）。ハッシュ（ "password123"）、
    }
}

@app.post（ "/token"、response_model = token）
async def login_for_access_token（form_data：oauth2passwordrequestform = depend（））：
    user = authenticate_user（fake_users_db、form_data.username、form_data.password）
    ユーザーではない場合：
        httpexceptionを上げる（
            status_code = status.http_401_unauthorized、
            詳細= "誤ったユーザー名またはパスワード"、
            headers = {"www-authenticate"： "Bearer"}、
        ））
    Access_token_expires = timedelta（minutes = access_token_expire_minutes）
    access_token = create_access_token（
        data = {"sub"：user.username}、expires_delta = access_token_expires
    ））
    return {"Access_Token"：Access_Token、 "token_type"： "Bearer"}

@app.get（ "/users/me"、respons_model = user）
async def read_users_me（current_user：user = depend（get_current_user））：
    current_userを返します
`` `
これで、OAUTH2とJWTを使用した認証と承認を備えたFASTAPIアプリケーションができました。/トークンのエンドポイントをテストしてアクセストークンを取得し、それを使用してSecured /Users /ME Endpointにアクセスできます。

将来的には、fake_users_dbを実際のデータベースに置き換える必要があります。SqlalchemyなどのORMを使用したり、別のデータベースライブラリを使用してデータベース操作を管理できます。

実際のデータベースの実装については、mock fake_users_dbの交換に取り組むか、その他の変更を加えたい場合はお知らせください。