Saltar al contenido

OpenAPI Condicional

Si lo necesitaras, podrías usar configuraciones y variables de entorno para configurar OpenAPI condicionalmente dependiendo del entorno, e incluso deshabilitarlo por completo.

Sobre seguridad, APIs, y documentación

Ocultar tus interfaces de usuario de documentación en producción no debería ser la forma de proteger tu API.

Eso no añade ninguna seguridad extra a tu API, las operaciones de ruta seguirán disponibles donde están.

Si hay una falla de seguridad en tu código, seguirá existiendo.

Ocultar la documentación simplemente hace más difícil entender cómo interactuar con tu API, y podría hacer más difícil depurarla en producción. Podría considerarse simplemente una forma de Seguridad por oscuridad.

Si quieres asegurar tu API, hay varias cosas mejores que puedes hacer, por ejemplo:

  • Asegúrate de tener bien definidos los modelos de Pydantic para tus cuerpos de petición y respuestas.
  • Configura los permisos y roles necesarios usando dependencias.
  • Nunca almacenes contraseñas en texto plano, solo hashes de contraseñas.
  • Implementa y usa herramientas criptográficas bien conocidas, como pwdlib y tokens JWT, etc.
  • Añade controles de permisos más granulares con scopes de OAuth2 donde sea necesario.
  • ...etc.

Sin embargo, podrías tener un caso de uso muy específico donde realmente necesites deshabilitar la documentación de la API para algún entorno (ej. para producción) o dependiendo de configuraciones de variables de entorno.

OpenAPI Condicional desde configuraciones y variables de entorno

Puedes fácilmente usar la misma configuración de Pydantic para configurar tu OpenAPI generado y las interfaces de documentación.

Por ejemplo:

from fastapi import FastAPI
from pydantic_settings import BaseSettings


class Settings(BaseSettings):
    openapi_url: str = "/openapi.json"


settings = Settings()

app = FastAPI(openapi_url=settings.openapi_url)


@app.get("/")
def root():
    return {"message": "Hello World"}

Aquí declaramos la configuración openapi_url con el mismo valor por defecto de "/openapi.json".

Y luego la usamos al crear la aplicación FastAPI.

Luego podrías deshabilitar OpenAPI (incluyendo la documentación UI) estableciendo la variable de entorno OPENAPI_URL a una cadena vacía, así:

fast →OPENAPI_URL= uvicorn main:app
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

restart ↻

Luego si vas a las URLs en /openapi.json, /docs, o /redoc simplemente obtendrás un error 404 Not Found así:

{
    "detail": "Not Found"
}