Flask-Login Сброс пароля MongoDB - Запрос не работает - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь реализовать сброс пароля с помощью ссылки на электронную почту во Flask.Это мой код в views.py:

@app.route("/reset_password/<token>", methods=['GET', 'POST'])
def reset_token(token):
    if current_user.is_authenticated:
        return redirect(url_for('homepage'))
    user = User.verify_reset_token(token)
    if user is None:
        flash('That is an invalid or expired token', 'warning')
        return redirect(url_for('reset_request'))
    form = ResetPasswordForm()
    if form.validate_on_submit():
       hashed_password = generate_password_hash(form.password.data, method='sha256') 
 User.objects(email=token.email).update_one(set__username=hashed_password)

        flash('Your password has been updated! You are now able to log in', 'success')
        return redirect(url_for('login'))
    return render_template('reset_token.html', title='Reset Password', form=form)

Это мой код в models.py

class User(UserMixin, db.Document):
meta = {'collection': 'users'}
email = db.StringField(max_length=35)
name = db.StringField(max_length=35)
surname = db.StringField(max_length=35)
password = db.StringField()
username = db.StringField()
image_file = db.StringField(nullable=False, default='static/img/default.jpg')

skills = db.ListField(db.StringField())

def get_reset_token(self, expires_sec=1800):
    s = Serializer(app.config['SECRET_KEY'], expires_sec)
    return s.dumps({'email': self.email}).decode('utf-8')

@staticmethod
def verify_reset_token(token):
    s = Serializer(app.config['SECRET_KEY'])
    try:
        email = s.loads(token)['email']
    except:
        return None
    return User.objects(email='email')

def __repr__(self):
    return f"User('{self.email}', '{self.image_file}')"

Это мой код в forms.py

    class RequestResetForm(FlaskForm):
    email = StringField('Email', validators=[validators.DataRequired()])
    submit = SubmitField('Request Password Reset')

    def validate_email(self, email):
        user = User.objects(email=email.data).first()
        if user is None:
            raise ValidationError('There is no account with that email. You must register first.')


class ResetPasswordForm(FlaskForm):
    password = PasswordField('New Password', validators=[validators.DataRequired()])
    confirm_password = PasswordField('Confirm Password', validators=[validators.DataRequired(), validators.EqualTo('password')])
    submit = SubmitField('Reset Password')

Когда я пытаюсь вставить новый пароль (после этого на мой электронный адрес была отправлена ​​ссылка с токеном), он не сохраняется, и я могу получить доступ к профилю со старым паролем.Я использую Mongoengine.Может кто-то помочь мне, пожалуйста?Спасибо.

1 Ответ

0 голосов
/ 31 декабря 2018

Вы уже определили свою модель пользователя с помощью метода проверки токена здесь

user = User.verify_reset_token(token)

Таким образом, вы должны «извлечь» письмо пользователя таким образом

User.objects(email=user.email).update_one(set__username=hashed_password)
...