Как получить объект пользователя, когда пользователь вошел в систему, и больше никто?

#fastapi

Вопрос:

Как получить объект пользователя, если пользователь вошел в систему, и никто другой?

Следуя документации FastAPI для получения пользователя /api_limits , приведенная ниже конечная точка возвращает значение 401, когда пользователь не вошел в систему (в приложении с соответствующими подписями jwt).

 from typing import Optional

from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel

app = FastAPI()

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")


class User(BaseModel):
    username: str
    email: Optional[str] = None
    full_name: Optional[str] = None
    disabled: Optional[bool] = None


def fake_decode_token(token):
    return User(
        username=token   "fakedecoded", email="john@example.com", full_name="John Doe"
    )


async def get_current_user(token: str = Depends(oauth2_scheme)):
    user = fake_decode_token(token)
    return user


@app.get("/api_limits")
async def read_users_me(current_user: User = Depends(get_current_user)):
    if current_user is None:
        return 2
    return 5
 

Как получить объект current_user пользователя внутри /api_limits конечной точки в приведенном выше примере кода None , когда пользователь не вошел в систему?

Ответ №1:

OAuth2PasswordBearer Автоматически генерируется ошибка 401, если Authorization заголовок вообще отсутствует (т. Е. Не отправляется действительный токен).

Если вы не хотите, чтобы это произошло, вы можете установить auto_error=False — в этом случае он вернется None , если заголовок не будет найден. Затем вы можете изменить свой get_current_user метод на возврат None вместо пользователя, если токен отсутствует:

 oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token", auto_error=False)

...

async def get_current_user(token: str = Depends(oauth2_scheme)):
    if not token:
        return None

    user = fake_decode_token(token)
    return user