web-dev-qa-db-ja.com

JWTトークンベースの承認でFASTAPI APIエンドポイントを保護する方法

私はPythonのFastapiに少し新しいことです。私は、JWTトークンベースの承認を持つ必要があるAPIバックエンドフレームワークを構築しています。さて、私はJWTトークンを生成する方法を知っていますが、Pythonの高速APIでAPIメソッドと統合する方法はわかりません。どんなポインタも本当に感謝されます。

3

私は受け入れられた答えに加えることができる特定の改善を見つけました:

  • HttpBearer Security Schemaを使用することを選択した場合、承認ヘッダーコンテンツは自動的に検証され、いいえ承認された回答のもののような機能を持つ必要がある、get_token_auth_header。さらに、生成されたドキュメントは、認証に関して、スーパークリアで説明的であることを目的としています。

enter image description here

  • トークンをデコードするときは、クラスJOSEErrorの子孫であるすべての例外をキャッチし、それらのメッセージを印刷し、特定の例外をキャッチし、カスタムメッセージの書き込みを回避できます。
  • ボーナス:JWTデコード方法では、あなたがそれらを検証したくないという事実を考えると、あなたが無視したいのかを指定することができます。

サンプルスニペット:どこで...

/endpoints
          - hello.py
          - __init__.p
dependency.py
main.py
# dependency.py script
from jose import jwt
from jose.exceptions import JOSEError
from fastapi import HTTPException, Depends
from fastapi.security import HTTPBasicCredentials, HTTPBearer

security = HTTPBearer()

async def has_access(credentials: HTTPBasicCredentials = Depends(security)):
    """
        Function that is used to validate the token in the case that it requires it
    """
    token = credentials.credentials

    try:
        payload = jwt.decode(token, key='secret', options={"verify_signature": False,
                                                           "verify_aud": False,
                                                           "verify_iss": False})
        print("payload => ", payload)
    except JOSEError as e:  # catches any exception
        raise HTTPException(
            status_code=401,
            detail=str(e))
# main.py script
from fastapi import FastAPI, Depends
from endpoints import hello
from dependency import has_access

app = FastAPI()

# routes
PROTECTED = [Depends(has_access)]

app.include_router(
    hello.router,
    prefix="/hello",
    dependencies=PROTECTED
)
# hello.py script
from fastapi import APIRouter

router = APIRouter()

@router.get("")
async def say_hi(name: str):
    return "Hi " + name

上記のすべての機能を利用することによって、あなたはセキュリティスーパーファストを持つAPIを構築するようになりました:)

1
onofricamila