Здесь мы продолжим нашу серию аутентификации 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 как во внешнем, так и во внутреннем интерфейсе нашего приложения имеет решающее значение для безопасности. Имея специальное промежуточное программное обеспечение, мы можем быть уверены, что каждый входящий запрос аутентифицируется, обеспечивая целостность нашего приложения. Такой подход повышает общую безопасность нашей системы, делая ее надежным выбором для защиты конфиденциальных данных и ресурсов.