Здесь мы продолжим нашу серию аутентификации Okta, в которой мы сначала узнаем об okta, например, как использовать панель управления okta для процесса аутентификации, затем мы используем наш домен okta и идентификатор клиента okta в приложении реагирования для реализации аутентификации во внешнем интерфейсе. Предыдущие статьи можно найти ниже в разделе «Похожие статьи». Теперь наш последний шаг — настроить аутентификацию Okta на нашем бэкэнде. Итак, наш интерфейс и серверная часть должны быть защищены.
Предварительные условия
Здесь мы указываем предпосылки для этой статьи. Предполагается, что читатель имеет хорошее знание Python и некоторое знакомство с FastAPI, поскольку эти навыки будут необходимы для реализации аутентификации Okta в нашем бэкэнде.
Обзор
В этом разделе мы углубимся в настройку промежуточного программного обеспечения для нашего приложения FastAPI. Мы объясняем цель создания специального промежуточного программного обеспечения для проверки аутентификации каждого входящего запроса. Мы также подробно описываем установку необходимой зависимости «okta_jwt_verifier».
Настройка промежуточного программного обеспечения
Для начала нам нужно установить необходимые зависимости для реализации Okta Authentication в FastAPI, а именно «okta_jwt_verifier». Получить его можно, выполнив следующую команду:
pip install okta_jwt_verifier==0.2.4
Чтобы создать собственное промежуточное программное обеспечение в вашем файле main.py
, мы будем использовать add_middleware()
. Ваш код будет выглядеть следующим образом:
from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from .okta_middleware import OktaJWTMiddleware # Create an instance of the FastAPI class app = FastAPI() # Add CORS middleware app.add_middleware( CORSMiddleware, allow_origins="*", allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Add Okta JWT Middleware app.add_middleware(OktaJWTMiddleware) # Testing URL @app.get("/") def index(): return {"message": "Congratulations, FastAPI this side."} # Define a route with a path parameter @app.get("/hello/{name}") async def read_item(name: str): return {"message": f"Hello, {name}"}
Пользовательское промежуточное ПО
Ваше пользовательское промежуточное ПО, расположенное в файле OktaJWTMiddleware
, будет выглядеть следующим образом:
import os from fastapi import Request from fastapi.responses import JSONResponse from okta_jwt_verifier import JWTVerifier from starlette.middleware.base import BaseHTTPMiddleware class OktaJWTMiddleware(BaseHTTPMiddleware): def __init__(self, app): super().__init__(app) async def dispatch(self, request: Request, call_next): OKTA_ISSUER = os.getenv("OKTA_ISSUER") OKTA_CLIENT_ID = os.getenv("OKTA_CLIENT_ID") accessToken = request.headers.get("authorization", None) if accessToken is not None: try: accessToken = accessToken.split(" ")[1] jwt_verifier = JWTVerifier(OKTA_ISSUER, OKTA_CLIENT_ID, "api://default") await jwt_verifier.verify_access_token(accessToken) return await call_next(request) except Exception as e: return JSONResponse({"error": f"Unauthorized token or {e}"}, status_code=401) else: return JSONResponse({"error": "Unauthorized Access"}, status_code=401)
При наличии этого промежуточного программного обеспечения каждый запрос к вашему серверу будет проходить аутентификацию. Если запрос не аутентифицирован, он вернет ответ «Несанкционированный доступ».
Похожие руководства
Ниже приведены ссылки на аутентификацию Okta в приложении React и FastAPI соответственно. Надеюсь, это звучит хорошо.
Включение аутентификации Okta (настройка панели управления Okta)
Настройка аутентификации Okta в приложении React (Vitejs)
Заключение
В заключение, реализация аутентификации Okta как во внешнем, так и во внутреннем интерфейсе нашего приложения имеет решающее значение для безопасности. Имея специальное промежуточное программное обеспечение, мы можем быть уверены, что каждый входящий запрос аутентифицируется, обеспечивая целостность нашего приложения. Такой подход повышает общую безопасность нашей системы, делая ее надежным выбором для защиты конфиденциальных данных и ресурсов.