Fast APIでWebAPIを作ってみる⑤

## FastAPIを利用してWebAPIを作っていくシリーズの第5弾となります。

### 今回は、前回作成したJWT発行機能を利用して各WebAPIに認証機能を追加していきます。<br>FastAPIに関するこれまでの記事は、以下にリンクを記載します。


タイトル|リンク
--|--
Fast APIでWebAPIを作ってみる①|[プロジェクトの作成](https://qiita.com/AQUA651/items/d130132493d6b2ad0bd7)
Fast APIでWebAPIを作ってみる②|[Docker上にpostgresを構築する方法](https://qiita.com/AQUA651/items/751a5dd3f3973143f630)
Fast APIでWebAPIを作ってみる③|[Docker上にpostgres環境にFastAPIでアクセスする](https://qiita.com/AQUA651/items/b30eaffbc77a252c3c5b)
Fast APIでWebAPIを作ってみる④|[JWTを利用してTokenを発行する](https://qiita.com/AQUA651/items/68e5d8af1a0a0baca52d)


## 開発環境
　　|バージョン
---|---
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/eec146a5-9623-d595-8240-c7a4385d665f.png)

鍵マークが、グレーアウトしている状態で、Excecuteボタンをクリックしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/93bc1030-17c1-4afb-4634-d64168831f49.png)

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

次に、鍵マークをクリックし、認証された状態で実行してみます。
鍵マークをクリックしてみます。
以下のmodal画面が表示されるので、ユーザ名とＰＷを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/d45fef29-0671-b9dc-af13-de48e8da5685.png)
認証されましたね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/7fd6be94-d14d-3116-905e-6b39585bf60a.png)

この状態で、再度、「execeute」ボタンをクリックすると、ちゃんと、テーブルに登録されているデータが表示されますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/7151e8a9-15d6-3ac7-e545-aec3f1847781.png)



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

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