Токен JSON не будет загружать значение после проверки

#python #json #flask

Вопрос:

Как только я доберусь до функции verify_token, она продолжит выполнение оператора except вместо возврата значения в «id_user», и я не уверен, почему. Я использую эти библиотеки. flask-логин, sqlalchemy, его опасно для jsonwebserializer и wtforms.

Функции

 def get_reset_token(user):  serial = Serializer(app.config['SECRET_KEY'], expires_in=900) # 15 mins in seconds  return serial.dumps({'id_user':user.id}).decode('utf-8')  def verify_token(token):  serial = Serializer(app.config['SECRET_KEY'])  try:  user_id = serial.load(token)['id_user']  except:  return None  return Users.query.get('id_user')  def send_mail(user):  token = get_reset_token(user)  message = Message('Password Reset Request', recipients = [user.email], sender='noreply@gmail.com')  message.body= f''' To Reset your password, click the following link:  {url_for('reset_token', token = token, _external = True)}  If you did not send this email, please ignore this message. '''  mail.send(message)  

маршруты

 @app.route('/password_reset', methods = ['GET', 'POST']) def password_reset():  form = Password_request()  if request.method == "POST":  if form.validate_on_submit:  user = Users.query.filter_by(email = form.email.data).first()  send_mail(user)  flash('Check your email. Password change request has been sent')  return redirect(url_for('login'))  else:  flash('Your email was not linked to an account')  return render_template('password_reset.html', form = form)   @app.route('/password_reset/lt;tokengt;', methods = ['GET', 'POST']) def reset_token(token):  user = verify_token(token)  if user == None:  flash('The token is invalid or expired')  return redirect(url_for('password_reset'))   form = Password_success()  if form.validate_on_submit:  hashed_password=generate_password_hash(form.password.data, method = 'sha256')  user.password = hashed_password  db.session.commit()  flash('Your password has been updated!')  return redirect(url_for('signup'))  

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

1. Вы сделали некоторые print шаги, чтобы понять, что вы на самом деле получаете за atoken? Печать token в reset_token и в verify_token была бы полезна.

2. Я напечатал токен в send_mail и токен verify_function, и оба они возвращают один и тот же токен.

Ответ №1:

 def verify_token(token):  serial = Serializer(app.config['SECRET_KEY'])  try:  user_id = serial.load(token)['id_user']  except:  return None  return Users.query.get('id_user') # this looks wrong  

Разве последняя строка verify_token не должна быть return Users.query.get(user_id) ? Вы присваиваете значение токена этой переменной , затем игнорируете его и указываете SQLAlchemy найти запись с идентификатором строкового значения 'id_user' , в чем я сомневаюсь, что вы собираетесь делать.

 def verify_token(token):  serial = Serializer(app.config['SECRET_KEY'])  try:  user_id = serial.load(token)['id_user']  except:  return None  return Users.query.get(user_id) # What happens when you change this?  

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

1. У меня было то же user_id = serial.load(token)['user_id'] самое, что и раньше, но это не сработало так же хорошо. Недавно я изменил его, потому что в flask-login использовался идентификатор пользователя, поэтому я подумал, что в словаре могут быть некоторые конфликтующие значения.

2. @Генри ваш фрагмент кода-это не то, что я предлагал, возможно, перечитайте его, чтобы убедиться, что мы на одной странице.