FastAPI OAuth2PasswordRequestForm 依赖导致请求失败

FastAPI OAuth2PasswordRequestForm dependency causing request failure

我正在使用 FastAPI user guide(JWT/Bearer 令牌)中详述的身份验证方案。当我尝试从 /token 端点获取令牌时,请求在路径操作函数运行之前失败。这是有问题的功能:

async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(), session: SessionLocal = Depends(get_db)):
    user = authenticate_user(session, form_data.username, form_data.password)
    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Incorrect username or password",
            headers={"WWW-Authenticate": "Bearer"},
        )
    access_token = create_access_token(data={"sub": user.id})
    return {"access_token": access_token, "token_type": "bearer"}

我通常使用断点来帮助找出在这些情况下出了什么问题,但是调用在函数中的任何代码实际运行之前就失败了,这让我相信问题出在 OAuth2PasswordRequestForm 依赖项上。我通过禁用 form_data parameter 验证了这是问题所在,并且能够执行完整的请求。

我得到的错误细节很少。这是我在控制台中得到的:INFO: 127.0.0.1:52261 - "POST /token HTTP/1.1" 400 Bad Request

这是我在 Swagger 中看到的 UI:

这在教程中使用的单一文件格式中对我有用,但我已经将内容分解成不同的文件以保持我的大型项目井井有条。我有一种感觉,在重新组织这段代码时,我只是错过了某个地方的某些东西,但似乎无法弄清楚是什么原因造成的。

当然,这个问题的解决方案在 the docs 中。问题是我缺少 python-multipart 依赖项。我只是 运行 pip install python-multipart 并重新启动了我的服务器,然后我就能够进行身份验证了。

创建令牌架构后,您需要将 response_model 设置为令牌:

class Token(BaseModel):
    access_token: str
    token_type: str

因此您的代码应如下所示

@router.post('/token', response_body=Token)