Python | Agregue autenticación de clave API al servicio backend FastAPI (basado en el paso de parámetros de ruta y los métodos de encabezado respectivamente y respaldados por la documentación de swagger)


01 Prefacio

FastAPI, como su nombre indica, es un marco extremadamente eficiente, especialmente adecuado para crear servicios backend API. Al interactuar con interfaces API de otros sitios web, la autenticación de clave API es un mecanismo de seguridad muy común. Un ejemplo típico es la interfaz ChatGPT. Necesitamos solicitar una clave API dedicada para iniciar una solicitud válida.

Aunque podemos personalizar directamente los parámetros de recepción al definir la interfaz, este método requiere agregar el mismo código a cada interfaz, lo cual es muy poco elegante, y este método no admite la visualización amigable del documento arrogante que viene con FastAPI.

Este artículo presentará cómo agregar autenticación de clave API a nuestro servicio backend en el marco FastAPI y utilizará dos soluciones diferentes para implementarlo: una es colocar la clave API en la ruta de solicitud URL y la otra es colocar la clave API. en la ruta de solicitud URL En el encabezado de la solicitud (Encabezado).

02 Agregar clave API en el método de paso de parámetros de ruta

2.1 Código completo

import uvicorn
from fastapi import HTTPException, status, Security, FastAPI
from fastapi.security import APIKeyQuery

# 可用的API_KEYS列表
API_KEYS = ["9d207bf0-10f5-4d8f-a479-22ff5aeff8d1", ...]

# 创建一个用于解析路径传参的对象
api_key_query = APIKeyQuery(name="api-key", auto_error=False)

# 定义一个获取请求中的api-key的函数 该函数接收一个上一步创建的对象封装
def get_api_key(api_key: str = Security(api_key_query)) -> str:
    if api_key in API_KEYS:
        return api_key
    raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid or missing API Key")

app = FastAPI()

@app.get("/public")
def public():
    """一个公共接口 无需api-key即可访问"""
    return "Public Endpoint."

# 需要api-key的接口,注意接受参数的写法。
@app.get("/private")
def private(api_key: str = Security(get_api_key)):
    """一个私有端点 需要在请求url中传入api-key"""
    return f"Private Endpoint. API Key: {
      
      api_key}"

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

2.2 Ejemplo de solicitud

Después de iniciar la aplicación, se puede acceder al "punto final privado" mediante la siguiente solicitud:

GET http://localhost:8000/private?api-key=9d207bf0-10f5-4d8f-a479-22ff5aeff8d1

2.3 prueba de documentos de arrogancia

Accede a la documentación de la interfaz y podrás ver que hay un buen soporte.

Haga clic Authorizeen el botón y complete la clave de API, para que la clave de API se pueda generar automáticamente al llamar a la interfaz que requiere autenticación.

Insertar descripción de la imagen aquí

03 Pase la clave API a través del encabezado de solicitud (recomendado)

3.1 Código completo

Este método es más seguro que el método anterior y se recomienda.

"""为请求添加api-key的示例 api-key通过header的方式发送"""
import uvicorn
from fastapi import HTTPException, status, Security, FastAPI
from fastapi.security import APIKeyHeader

# 可用的API_KEYS列表
API_KEYS = ["9d207bf0-10f5-4d8f-a479-22ff5aeff8d1", ...]

# 创建一个用于解析路径传参的对象
api_key_header = APIKeyHeader(name="api-key", auto_error=False)

# 定义一个获取请求中的api-key的函数 该函数接收一个上一步创建的对象封装
def get_api_key(api_key: str = Security(api_key_header)) -> str:
    if api_key in API_KEYS:
        return api_key
    raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid or missing API Key")

app = FastAPI()

@app.get("/public")
def public():
    """一个公共接口 无需api-key即可访问"""
    return "Public Endpoint."

# 需要api-key的接口,注意接受参数的写法。
@app.get("/private")
def private(api_key: str = Security(get_api_key)):
    """一个私有端点 需要在请求url中传入api-key"""
    return f"Private Endpoint. API Key: {
      
      api_key}"

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

3.2 Ejemplo de solicitud

Después de iniciar la aplicación, puede acceder al "punto final privado" usando el siguiente comando curl:

curl -H "api-key: 9d207bf0-10f5-4d8f-a479-22ff5aeff8d1" http://localhost:8000/private

3.3 prueba de documentos de arrogancia

Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

¡La configuración está completa y todo es normal!

(encima)

Supongo que te gusta

Origin blog.csdn.net/xuzhongyi103/article/details/132981745
Recomendado
Clasificación