реализация flask_jwt_extended с отрисовкой шаблонов

Снова борюсь с попыткой создать свое первое приложение для фляги, на этот раз (после того, как я создал все, что мне нужно, и все работает гладко) Я пытаюсь защитить некоторые конечные точки с помощью flask_jwt_extended, но я не могу найти, как работать с ними на своих страницах документация в основном посвящена отображению сообщений JSON, а в некоторых руководствах используется почтальон, а в моем случае я использую шаблоны HTML.
Например, пользователь отправляет свои учетные данные со страницы входа в эту конечную точку:

@app.route('/login', methods=['POST'])
def UserLogin():
    data = parser.parse_args()
    current_user = UserModel.find_by_username(data['username'])
    if not current_user:
        return {'message': 'User {} doesn\'t exist'.format(data['username'])}

    if UserModel.verify_hash(data['password'], current_user.password):
        access_token = create_access_token(identity = data['username'])
        refresh_token = create_refresh_token(identity = data['username'])
        resp = jsonify({'login': True})         #I just added this line from the documentation
        set_access_cookies(resp, access_token)  # and this one
        set_refresh_cookies(resp, refresh_token) # and this one
        return redirect(url_for('results'))

    else:
        return {'message': 'Wrong credentials'}

и, конечно же, я добавил декоратор @jwt_required в конечную точку results:

@app.route('/result',methods = ['POST','GET'])
@jwt_required
def results():
    temp={}
    if request.method == 'POST':
        # some code to fill temp with values
    return render_template('result.html',data=temp)

Итак, я получаю { "msg": "Missing cookie \"access_token_cookie\"" }
Очевидно, потому что я не отправляю jwt обратно, но если отправить его в операторе return, как я могу перенаправить пользователя на нужную страницу ??
И действительно, я использовал app.config['JWT_TOKEN_LOCATION'] = ['cookies']


person Green    schedule 22.03.2019    source источник
comment
вы можете показать полный запрос (например, используя curl)?   -  person Danila Ganchar    schedule 22.03.2019
comment
Я не понял, что вы имели в виду, но запрос, отправленный в конечную точку входа, отправляется из простой базовой формы (на странице HTML).   -  person Green    schedule 22.03.2019


Ответы (2)


Вы можете захотеть:

resp = make_response(redirect(url_for('results')))
set_access_cookies(resp, access_token)
set_refresh_cookies(resp, refresh_token)
return resp

Я не думаю, что вам нужна эта строчка! -> resp = jsonify({'login': True})

Мне потребовалось время, чтобы понять это, я не уверен, почему эта часть неясна в docs, большинство приведенных здесь примеров просто возвращает JSON напрямую

person Khaled    schedule 23.03.2019
comment
Именно то, что я искал, и действительно, мы боремся с документацией по этой части, надеемся, что она скоро будет обновлена. - person Green; 25.03.2019

Кроме того, вы получите ту же ошибку, если JWT_ACCESS_COOKIE_PATH маршрутизируется неправильно.

person user3883642    schedule 15.09.2020