如何让 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)])
我使用这个 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)])