#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
маршрутизируется неправильно.