#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