LoginSignup
1
0

FastAPIでOAuth2を体験する

Posted at

はじめに

最近FastAPIにハマっています。直観的にコードが書けるところやSwaggerを自動生成してくれるところに魅力を感じています。
また公式ドキュメントいわく

高速: NodeJS や Go 並みのとても高いパフォーマンス (Starlette と Pydantic のおかげです)。 最も高速な Python フレームワークの一つです.

と性能もかなり高水準なようです!!
SQLAlchemy2.0以降はDBとの非同期接続に対応しており、より高速な処理が期待できそうです。

FastAPIにはOAuth2が組み込まれており、簡単にOAuth2認証を実装できます。
今回はFastAPIを使用して、タスク管理アプリを例にOAuth2認証を体験したいと思います。

概要

FastAPIの公式チュートリアルにはOAuth2の実装方法が書いてあるのですが少し読みづらい部分があります。
Githubにコードをあげているので、こちらも参考にしていただければ幸いです。

FastAPIの実装に関しては以下の記事を参考にしています。

この記事では、ファイル分割やテストコードなど必要な情報が網羅されておりチュートリアルとしてお勧めです。

OAuth2がなかったらどうなるのか

まず、OAuth2を使用しないでAPIを設計すると、どのような問題が生じるかを体験してみましょう。

$ git clone https://github.com/Tanakaryuki/FastAPI_OAuth2.git
$ cd FastAPI_OAuth2
$ git checkout fix
$ docker-compose build
$ docker-compose up

localhost:8000/docsにアクセスするとSwaggerが表示されます。
image.png

始めにアカウント作成をしてみましょう。
/api/signupからTry it outをクリックし、現れたExecuteをクリックします。
image.png
下の画像のようになっていたら成功です。
image.png

次にタスクを作成してみましょう。
/api/taskからタスクを作成出来ます。
administrator_usernameは先ほど作成したアカウントのusernameを利用してください。
idは記録しておいてください。

下の画像のようになったら成功です
image.png

通常、ユーザの情報はユーザ自身しか閲覧できません。しかし、現状APIを実行することで誰でも閲覧できる状態にあります。
現に/api/task/{id}から誰でも閲覧可能です。
image.png

このままでは個人情報が保護されません。
そこで登場するのがOAuth2です。さっそく利用してみましょう。

OAuth2があったらどうなるか

それではOAuth2が実装されているブランチに移動してみましょう。
このブランチでは、タスクの作成・取得にOAuth認証が必要になります。

$ git checkout main

OAuth2を利用する際にはJWTトークンの署名に使用されるランダムな秘密鍵が必要になりますので、以下のコマンドで生成します。

$ openssl rand -hex 32

生成した秘密鍵を保存したら.env.sampleを参考にして.envファイルを作成します。
以下を例に入力してください。
image.png
SECRET_KEYには先ほど作成した秘密鍵を配置してください。

設定が完了したら起動してみましょう。

docker-compose up

起動に成功したら以下のような画面が表示されるはずです。
image.png

先ほど作成したタスクを/api/task/{id}から取得してみましょう。
image.png

認証エラーが返ってきました。

次に認証してからタスクを取得してみましょう。
右上にある鍵アイコンをクリックします。
usernameとpasswordを求められるので入力します。
image.png
入力が完了したらAuthorizeをクリックします。
認証が完了したら以下の画像のようになります。
image.png

もう一度タスクを取得してみましょう。
image.png
これでタスクを正常に取得出来ました。

OAuth2を利用するメリット

セキュリティの向上

OAuth2は高度なセキュリティ機能を提供する認証プロトコルであり、ユーザの認証情報を安全に管理できます。
トークンベースの認証を採用することで、アクセストークンが漏洩しても被害範囲を抑えることが可能です。

アクセス制限

OAuth2はアクセストークンを使用してアクセス制限を効果的に管理できます。これによりクライアントがどのリソースにアクセスできるかを制限し、セキュリティを向上させることができます。

外部サービスとの統合

OAuth2は標準化されたプロトコルであり、多くの開発者やサービスが採用しています。
これにより異なるアプリケーションやサービス間での相互運用性が向上し、外部サービスとの統合が容易になります。

まとめ

今回、OAuth2を利用してセキュアなAPIを実現する過程を体験しました。
FastAPIとOAuth2を組み合わせることで、高い開発生産性とセキュアな認証・認可の仕組みを構築することが可能です。
またFastAPIはスキーマ設計と相性がとても良いので、是非触ってみて欲しいです。

1
0
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
1
0