JWT не передается в заголовке Авторизации
Работаю сейчас с flusk, решил сделать авторизацию по JWT. С самой авторизацией проблем нет - вводим логин, пароль и успешно авторизуемся. 100% создаются access_token и refresh_token, при этом вторые я храню в бд и удаляю при выходе из профиля. Через инструменты разработчика можно найти токены в Cookie.
@app.route('/user/create', methods=['GET', 'POST'])
@jwt_required()
def create_user():
form = CreateUserForm()
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
password = generate_password_hash(password)
telegram_user = request.form['user_id']
new_user_app = UserApp(username=username, password=password)
user = User.query.filter_by(user_id=telegram_user).first()
db.session.add(new_user_app)
db.session.commit()
user.user_app_id = new_user_app.id
db.session.add(user)
db.session.commit()
return jsonify({'success': 'Пользователь успешно создан'})
return render_template('create_user.html', form=form, title='Добавить пользователя')
Хочу перейти на страницу /user/create
с декоратором, а в ответ {"msg":"Missing Authorization Header"}
На всякий случай сама авторизация:
@app.route('/login', methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
return redirect(url_for('index'))
form = LoginForm()
if form.validate_on_submit():
user = db.session.scalar(
sa.select(UserApp).where(UserApp.username == form.username.data))
if user is None or not user.check_password(form.password.data):
flash('Invalid username or password')
return redirect(url_for('login'))
login_user(user)
access_token, refresh_token = create_tokens(user.id)
next_page = request.args.get('next')
response = make_response(redirect(next_page) if next_page else redirect(url_for('index')))
response.set_cookie('access_token', access_token, httponly=True, secure=False)
response.set_cookie('refresh_token', refresh_token, httponly=True, secure=False)
return response
return render_template('login.html', title='Авторизация', form=form)
И создание токенов:
def create_tokens(user_id):
access_token = jwt.encode(
{'user_id': user_id,
'exp': datetime.datetime.now(ZoneInfo('UTC')) + datetime.timedelta(minutes=15)}, app.config['SECRET_KEY'], algorithm='HS256')
refresh_token = jwt.encode(
{'user_id': user_id,
'exp': datetime.datetime.now(ZoneInfo('UTC')) + datetime.timedelta(days=30)}, app.config['SECRET_KEY'], algorithm='HS256')
new_refresh_token = RefreshToken(user_id=user_id, token=refresh_token, expires_at=datetime.datetime.now(ZoneInfo('UTC')) + datetime.timedelta(days=30))
db.session.add(new_refresh_token)
db.session.commit()
return access_token, refresh_token
Ответы (1 шт):
Автор решения: kurenma
→ Ссылка
Проблема заключалась в самой конфигурации:
JWT_TOKEN_LOCATION = ['cookies']
Это поможет решить проблему с передачей в заголовке. Также в моем примере есть другие ошибки:
{'user_id': user_id, # user_id следует заменить на 'sub', также значение должно быть str
'exp': datetime.datetime.now(ZoneInfo('UTC')) + datetime.timedelta(minutes=15)}, app.config['SECRET_KEY'], algorithm='HS256')