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

#python #cookies #flask #jwt #flask-jwt-extended

#python #файлы cookie #flask #jwt #flask-jwt-расширенный

Вопрос:

На этот раз я снова пытаюсь создать свое первое приложение flask (после того, как я создал все, что мне нужно, и все работает гладко) Я пытаюсь защитить некоторые конечные точки с помощью flask_jwt_extended , но я не могу найти, как работать с ними на своих страницах, документация в основном посвящена отображению сообщений в формате JSON, а в некоторых руководствах используется postman, в то время как в моем случае я использую шаблоны 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']

Комментарии:

1. можете ли вы показать полный запрос (например, используя curl )?

2. Я не совсем понял, что вы имели в виду, но запрос, отправленный на конечную точку входа, отправляется из простой базовой формы (на HTML-странице).

Ответ №1:

Возможно, вы захотите:

 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})

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

Комментарии:

1. Именно то, что я искал, и действительно, мы боремся с документами об этой части, надеюсь, что она скоро будет обновлена.

Ответ №2:

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