【Python】 FastAPIでBearer認証を実装する

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

最近ふざけた内容が多かったので、少し真面目に。

背景

Nuxt.js + FastAPI でツールを作成している。認証周りで @nuxtjs/auth を使用したところ、スクラッチでAPIを作成している場合にはJWTを使った認証が標準っぽかったので、API側もそれに合わせた。

ソースコード

umentu/fastapi_bearer

解説

ほぼJWTの解説になってしまっているけど、②と⑥の部分をFastAPIで実装している。以下すべてのソースコードはGitHubの方にみてもらうとして、FastAPIの部分だけを抜粋すると次の2つの関数のみ。

@app.post('/get_token', response_model=models.GetTokenResponseModel)
def get_token(m: models.GetTokenModel):

    user = search_user_for_token(m.userName, m.password)

    if not user:
        raise HTTPException(
            status_code=HTTP_401_UNAUTHORIZED,
            detail='ユーザー名/パスワードが違います',
            headers={'WWW-Authenticate': 'Bearer'}
        )


    # トークンを作成
    token_expires = timedelta(minutes=TOKEN_EXPIRE_MINUTES)
    access_token = create_access_token(
        data={'userName': user['userName']},
        expires_delta=token_expires
    )
    return {'token': access_token, 'token_type': 'bearer'}

@app.post('/get_user', response_model=models.GetUserResponseModel)
async def get_user(user_data: models.GetUserResponseModel = Depends(get_user_data)):

    return JSONResponse({'user': user_data})

/get_token へアクセスするとユーザー情報を暗号化してトークンを作成し返す。返されたトークンを /get_user に投げるとトークンを復号化してユーザー情報を取得し、それを元にユーザー情報を返す。ただこれだけ。クライアント側は、トークンをLocalStorageに保存すればいい。

テスト

Related posts

コメントを残す