如何让 fastapi 使用 x-gitlab-token header 进行身份验证

how to make fastapi use x-gitlab-token header for authentication

我使用这个 documentation 来保护我的 fastapi 应用程序中的一些端点。 它似乎工作正常,我也能够 运行 一些测试(使用 pytest):

...
client = TestClient(app=app)
response = client.post(
            "/my_end_point",
            json={'data':'model'},
            headers={"Authorization": f"Bearer {token}"},
        )
...

我的问题是,我想将我的应用程序连接到 Gitlab Webhook,当这样做时,Gitlab 发送这个 header:

{'x-gitlab-token':'some-token-that-can-be-defined-when-setting-up-the-webhook'}

这意味着,即使我在 Gitlab Webhook 配置中配置了一个有效的令牌,它也不会被我的 FastAPI 应用程序接受,这 returns 401 未授权 错误.

我想我的问题是如何指示 FastApi 从 'x-gitlab-token' 密钥而不是 'Authorization' 密钥

中获取令牌

有一个示例可以说明如何 use Header in a dependency function in FastAPI's user guide

一个独立的例子:

import uvicorn

from fastapi import (
    Depends,
    FastAPI,
    Header,
    HTTPException,
)

def authenticate_gitlab(x_gitlab_token: str = Header(...)):
    if x_gitlab_token != 'magic':
        raise HTTPException(status_code=403)

    return x_gitlab_token

app = FastAPI()

@app.get("/")
async def req(authenticated_with: str = Depends(authenticate_gitlab)):
    return {'authenticated_with': authenticated_with}

    
if __name__ == "__main__":
    uvicorn.run("foo:app", host="127.0.0.1", port=5000, log_level="info")

这会接受任何 X-Gitlab-Token 设置为 magic 的请求,同时拒绝其他键:

λ curl http://localhost:5000 -H "X-GitLab-Token: foo"
{"detail":"Forbidden"}

λ curl http://localhost:5000 -H "X-GitLab-Token: magic"
{"authenticated_with":"magic"}

您可以在创建 APIRouter 时使用 dependencies 参数,以便在给定路由器中的每个路由之前具有依赖性 运行(您可以根据需要将多个路由器组合在一起):

authenticated_router = APIRouter(dependencies=[Depends(authenticate_gitlab)])