Как отправить bearer токен вместе с RedirectResponse FastApi
Я начал изучение фастапи и захотел сделать регистрацию и авторизацию с формами, у меня есть вот такая html форма для входа в аккаунт, но при отправке данных получается ошибка {"detail":"Not authenticated"}. Как мне сделать правильно доступ к конечной точке '/' только с токеном?
auth.html
<div class="row">
<form class="row-form" action="/login/user" method="post">
<input
class="registration_inputs"
type="text"
required
name="username"
id="username"
placeholder="email"
/>
<input
type="text"
required
class="registration_inputs"
name="password"
id="password"
placeholder="password"
/>
<button type="submit" class="reg-button" >Войти</button>
<p class="auth_text">
Нет аккаунта?
<a href="/register" class="go_auth">Зарегистрироваться</a>
</p>
</form>
Вот весь код для авторизации auth/auth_functions.py
oauth2_bearer = OAuth2PasswordBearer(tokenUrl='token')
config = load_auth_config()
db = Database()
def authenticate_user(bcrypt_context: CryptContext, email: str, password: str):
user = db.check_user_in_base(email, get_user=True)
request = {'user': '', 'error': ''}
if not user:
request.update({'error': 'Пользователя с такой почтой не существует!'})
elif not bcrypt_context.verify(password, user.hashed_password):
request.update({'error': 'Вы ввели неправильный пароль!'})
else:
request.update({'user': user})
return request
def create_access_token(username: str, user_id: int, expires_delta: timedelta):
encode = {'sub': username, 'id': user_id}
expires = datetime.utcnow() + expires_delta
encode.update({'exp': expires})
return jwt.encode(encode, config.secret_key, algorithm=config.algorithm)
async def get_current_user(
token: Annotated[str, Depends(oauth2_bearer)],
):
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(token, config.secret_key, algorithms=[config.algorithm])
email: str = payload.get("sub")
if email is None:
raise credentials_exception
except JWTError:
raise credentials_exception
user = db.check_user_in_base(email)
if not user:
raise credentials_exception
return user
auth/auth.py
@router.post('/login/user/', response_model=Token)
async def login_for_access_token(form_data: Annotated[OAuth2PasswordRequestForm, Depends()], request: Request):
user, error = authenticate_user(bcrypt_context, form_data.username, form_data.password).values()
if not user:
return templates.TemplateResponse(
'auth.html', {'request': request,
'error': error}
)
token = create_access_token(user.email, user.id, timedelta(minutes=1))
return RedirectResponse('/')
main.py
@app.post('/')
async def auth_successful(token=Depends(get_current_user)):
return token
@app.get('/login')
async def login_page(request: Request):
return templates.TemplateResponse('auth.html', {'request': request})