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')
→ Ссылка