FastAPIを利用してWebAPIを作っていくシリーズの第5弾となります。
今回は、前回作成したJWT発行機能を利用して各WebAPIに認証機能を追加していきます。
FastAPIに関するこれまでの記事は、以下にリンクを記載します。
| タイトル | リンク |
|---|---|
| Fast APIでWebAPIを作ってみる① | プロジェクトの作成 |
| Fast APIでWebAPIを作ってみる② | Docker上にpostgresを構築する方法 |
| Fast APIでWebAPIを作ってみる③ | Docker上にpostgres環境にFastAPIでアクセスする |
| Fast APIでWebAPIを作ってみる④ | JWTを利用してTokenを発行する |
開発環境
| バージョン | |
|---|---|
| Python | 3.10.4 |
| FastAPI | 0.78.0 |
| Uvicorn | 0.18.1 |
| Docker | 20.10.16 |
| Postgres | 14.4 |
| SQLAlchemy | 1.4.39 |
| python-jpse | 3.3.0 |
| bcrypt | 1.7.4 |
| python-multipart | 0.0.5 |
今回のお題
①JWTの検証処理の実装
②Controllerに認証機能を追加
③動作検証
あたりまで実装していきます。
実装!
①JWTの検証処理の実装
# Access Tokenの解析
async def Analysis_ACCESS_Token(access_token:str = Depends(oauth2_scheme)):
# 設定されているAccessTokenの解析
try:
payload = jwt.decode(access_token,config.JWT_SECRET_KEY,algorithms=config.JWT_ALGORITHM)
usercd:str = payload.get("usercd")
except JWTError as err:
print(err)
# AccessTokenから取得したユーザCDを使い、ユーザマスタからユーザ情報を取得する。
user = MaUserRepository.MaUserRepository.getbyusercd(usercd)
print(user)
if user is None:
raise HTTPException(status_code=400, detail="Inactive user")
return user
引数で渡されたJWTを解析し、その中からユーザ情報を取得します。
ユーザ情報が取得できなければ、エラー。取得できれば、ユーザマスタからユーザ情報を取得しに行きます。
そして、取得したユーザ情報を戻り値として返します。
②Controllerに認証機能を追加
続いて、各Controllerに認証機能を追加していきます。
from app.models.DAO.MaCodeRepository import MaCodeRepository
from app.models.DTO.ma_user_model import MA_USER_SELECT
from fastapi import APIRouter,Depends
from app.services.authentication_service import JWTService
router = APIRouter()
# MA_CODEに登録されいる全件を取得する。
@router.get("/all")
async def get_all_code(current_user: MA_USER_SELECT = Depends(JWTService.Analysis_ACCESS_Token)):
all_ma_codedata = MaCodeRepository.selectallcode()
return all_ma_codedata
本関数(get_all_code)の引数に「current_user: MA_USER_SELECT = Depends(JWTService.Analysis_ACCESS_Token)」を追加します。
ユーザ情報が取得できなければ、401エラーを返すようにしています。
③動作検証
動作検証を行っていきます。
以下のURLを開くと、swaggerが起動します。
その中で、右端に鍵のマークが表示されています。これで、認証機能が追加されたことが分かります。

鍵マークが、グレーアウトしている状態で、Excecuteボタンをクリックしてみます。

当然、401エラーが表示されています。
認証されていないので、当然ですよね。
次に、鍵マークをクリックし、認証された状態で実行してみます。
鍵マークをクリックしてみます。
以下のmodal画面が表示されるので、ユーザ名とPWを入力します。

認証されましたね!

この状態で、再度、「execeute」ボタンをクリックすると、ちゃんと、テーブルに登録されているデータが表示されますね!

今回はここまでとなります。
次回は、Insert/Update/Delete機能を追加していきます。