2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Fast APIでWebAPIを作ってみる⑤

Last updated at Posted at 2022-07-26

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の検証処理の実装

authentication_service.py
    # 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に認証機能を追加していきます。

ma_codeController.py
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が起動します。
その中で、右端に鍵のマークが表示されています。これで、認証機能が追加されたことが分かります。
image.png

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

当然、401エラーが表示されています。
認証されていないので、当然ですよね。

次に、鍵マークをクリックし、認証された状態で実行してみます。
鍵マークをクリックしてみます。
以下のmodal画面が表示されるので、ユーザ名とPWを入力します。
image.png
認証されましたね!
image.png

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

今回はここまでとなります。

次回は、Insert/Update/Delete機能を追加していきます。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?