示例化自定义OAuth2类后出现NameError:未定义名称“Request”错误

2q5ifsrm  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(105)

我正在尝试编写一个自定义的OAuth2类,它可以使用fastAPI在所有请求的cookie或标头中检查用户身份验证。在从starlette导入Request类并将其用作call函数输入的类型提示后,当我示例化该类时,我得到一个NameError。请帮助

from __future__ import annotations
from typing import Optional

from fastapi import status
from starlette.requests import Request
from fastapi.openapi.models import OAuthFlows as OAuthFlowsModel
from fastapi.security import OAuth2
from fastapi.security.utils import get_authorization_scheme_param

class OAuth2PasswordBearerCookie(OAuth2):
    def __init__(
        self,
        tokenUrl: str,
        scheme_name: str = None,
        scopes: dict = None,
        auto_error: bool = True,
    ):
        if not scopes:
            scopes = {}
        flows = OAuthFlowsModel(password={"tokenUrl": tokenUrl, "scopes": scopes})
        super().__init__(flows=flows, scheme_name=scheme_name, auto_error=auto_error)

    async def __call__(self, request: Request) -> Optional[str]:
        header_authorization: str = request.headers.get("Authorization")
        cookie_authorization: str = request.cookies.get("Authorization")

        header_scheme, header_param = get_authorization_scheme_param(
            header_authorization
        )
        cookie_scheme, cookie_param = get_authorization_scheme_param(
            cookie_authorization
        )

        if header_scheme.lower() == "bearer":
            authorization = True
            scheme = header_scheme
            param = header_param

        elif cookie_scheme.lower() == "bearer":
            authorization = True
            scheme = cookie_scheme
            param = cookie_param

        else:
            authorization = False

        if not authorization or scheme.lower() != "bearer":
            if self.auto_error:
                raise HTTPException(
                    status_code=status.HTTP_401_UNAUTHORIZED,
                    detail="Not authenticated",
                    headers={"WWW-Authenticate": "Bearer"},
                )
            else:
                return None
        return param
nle07wnf

nle07wnf1#

不算是答案因为我不知道出了什么问题但是...
删除此操作似乎有效

from __future__ import annotations

如果有谁能详细说明一下的话!

相关问题