Python 启用 FastAPI API 密钥标头

Rod*_*o A 4 python python-3.x fastapi

我想启用 API 密钥标头以使用 FastAPI 在我的 API 中生成不记名令牌,但我在从 OpenAPI UI 获取和发送不记名令牌时遇到问题,我的令牌端点如下所示

api_key_header = APIKeyHeader(name='X-API-Key', auto_error=True)

app_auth = APIRouter()


@app_auth.post('/token', summary="Returns Bearer Token",
               tags=["Auth"])
async def login(api_key_header: str = Security(api_key_header)):
    if api_key_header != '123':
        raise HTTPException(status_code=HTTP_401_UNAUTHORIZED,
                            detail='wrong api key',
                            headers={"WWW-Authenticate": "Bearer"})
    else:
        jwt_token = create_jwt_token(user)
        return jwt_token
Run Code Online (Sandbox Code Playgroud)

这可以正常工作并按预期返回不记名令牌 在此输入图像描述

它还向我显示了“授权”按钮的标题 在此输入图像描述 在此输入图像描述

但是,我通过 OpenAPI 将生成的令牌传递到另一个端点时遇到了麻烦(如果我只是将它发送到其他客户端的标头中,它就可以工作),当我测试其他端点时,它不会在标头中发送令牌 在此输入图像描述

我也启用了

oauth_schema = OAuth2PasswordBearer(tokenUrl='/token')
Run Code Online (Sandbox Code Playgroud)
app = FastAPI(title="My test api", version="1.0")

app.include_router(app_auth)
app.include_router(app_test, prefix='/v1.0', dependencies=[Depends(check_jwt_token)])
Run Code Online (Sandbox Code Playgroud)

和 check_jwt_token

async def check_jwt_token(token: str = Depends(oauth_schema)):
   """
   it decods the token and check if already expired
   """
Run Code Online (Sandbox Code Playgroud)

额外:您可以看到端点正确处理承载令牌,由邮递员测试

在此输入图像描述

Rod*_*o A 6

我只是弄清楚,这是答案,以防对其他人有帮助

我只需要改变oauth_schema = OAuth2PasswordBearer(tokenUrl='/token')

foroauth_schema = HTTPBearer()和 change async def check_jwt_token(token: HTTPAuthorizationCredentials = Security(oauth_schema)),以及函数内部:

token= token.dict()['credentials']