FastAPI - 成功登录后,没有收到授权标头,也来自 Swagger,并且仅在部署在服务器上时

问题描述 投票:0回答:2

我的 FastAPI 在我的本地主机中工作,但是当部署在服务器上时,会发生以下情况:

登录成功,并从响应中检索到令牌。

成功登录后,任何需要依赖项 oauth2_scheme 的 API 调用都会引发错误 401,包括来自 Swagger 的 API 调用。 调试问题后,客户端的请求中没有 Authorization 标头,尽管已发送。这仅发生在服务器部署(Linux 或 Windows)中,在本地主机中一切正常。

因此以下调用在我的本地主机中有效,但在服务器中无效。

curl -X 'GET' \
  'http://url/me' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer token_received_from_successful_login'

调用 Depends(oauth2_scheme) 时引发错误:

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/login")

例如,下面的路径 http:/url/me 当我的 FastAPI 部署在本地(localhost)时返回用户,但当部署在服务器上时返回 401。

@app.get("/me", response_model=User)
async def who_am_I(current_user: User = Depends(get_user_from_jwt)):
    return current_user


async def get_user_from_jwt(token: str = Depends(oauth2_scheme)):
    credentials_exception = HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="Could not validate credentials",
        headers={"WWW-Authenticate": "Bearer"},
    )
    try:
        if not token: # tested with auto_error=False
            return None

        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        username = payload.get("sub")
        email = payload.get("email")
        if username is None:
            print("Error in token decoding")
            raise credentials_exception
    except JWTError:
        raise credentials_exception
    return User(**{
        'username': username,
        'email': email
    })

当调用 get_user_from_jwt 时,问题是在 oauth2_scheme 内部引发的。

我正在使用 Gunicorn 服务器和 4 个 Uvicorn 工作人员启动 API。

本地主机和服务器部署完全相同,安装的软件包、python 软件包版本等绝对没有区别...

在 Linux 和 Windows 服务器中进行测试,完整服务器设置或使用容器,同样的问题。

在 Windows 服务器上使用 PyCharm 进行调试,我发现从客户端收到的请求(包括成功登录后的 Swagger)没有 Authorization 标头,这会引发错误 401。

但是 Swagger 和其他客户端确实发送了 Authorization 标头。 并且相同的 API 在本地主机中成功运行。

python docker oauth-2.0 swagger fastapi
2个回答
0
投票

已解决,原因是一个很难找到的网络设置,该设置从 http 请求中删除了 auth 标头,与 FastAPI 完全无关。


0
投票

您能更详细地说明您是如何解决这个问题的吗?我也在经历同样的事情。

© www.soinside.com 2019 - 2024. All rights reserved.