2016-03-15 4 views
-1

В настоящее время я изучаю Flask через книгу Мигеля Гринберга. Если вы знакомы вы знаете Flasky (Приложение, которое используют Miguel во время книги)Получение информации о пользователе через его опасный токен

Я сейчас в разделе 8, имея дело с Сброс пароля, то здесь исходный код (вы также можете найти его на репо. это тег 8g):

models.py

class User(UserMixin, db.Model): 
    __tablename__ = 'users' 
    ... 
    def generate_reset_token(self, expiration=3600): 
     s = Serializer(current_app.config['SECRET_KEY'], expiration) 
     return s.dumps({'reset': self.id}) 

    def reset_password(self, token, new_password): 
     s = Serializer(current_app.config['SECRET_KEY']) 
     try: 
      data = s.loads(token) 
     except: 
      return False 
     if data.get('reset') != self.id: 
      return False 
     self.password = new_password 
     db.session.add(self) 
     return True 

авториз/views.py

@auth.route('/reset/<token>', methods=['GET', 'POST']) 
def password_reset(token): 
    if not current_user.is_anonymous: 
     return redirect(url_for('main.index')) 
    form = PasswordResetForm() 
    if form.validate_on_submit(): 
     user = User.query.filter_by(email=form.email.data).first() 
     if user is None: 
      return redirect(url_for('main.index')) 
     if user.reset_password(token, form.password.data): 
      flash('Your password has been updated.') 
      return redirect(url_for('auth.login')) 
     else: 
      return redirect(url_for('main.index')) 
    return render_template('auth/reset_password.html', form=form) 

авториз/forms.py

class PasswordResetForm(Form): 
    email = StringField('Email', validators=[Required(), Length(1, 64), 
              Email()]) 
    password = PasswordField('New Password', validators=[ 
     Required(), EqualTo('password2', message='Passwords must match')]) 
    password2 = PasswordField('Confirm password', validators=[Required()]) 
    submit = SubmitField('Reset Password') 

    def validate_email(self, field): 
     if User.query.filter_by(email=field.data).first() is None: 
      raise ValidationError('Unknown email address.') 

Мой вопрос:

Я не хочу, чтобы спросить у пользователя его адрес электронной почты еще раз, так как они изменяют пароль через электронную почту, которую они получили , Есть ли способ получить сообщение пользователя или пользователя от этого токена?

ответ

0

Хорошо, если это может быть полезно для кого-то другого. Информация пользователя уже находится в токене в {'reset': user_id}.

Проблема в том, что логика управления токеном находится в модели пользователя. Таким образом, наличие в поле электронной почты в форме для последующего нахождения этого пользователя в представлении делает трюк в текущей версии

Поскольку вы получите маркер в этой точке зрения мы можем переместить эту логику к виду:

Идента /views.py

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer 

@auth.route('/reset/<token>', methods=['GET', 'POST']) 
def reset_password(token): 
    s = Serializer(current_app.config['SECRET_KEY']) 
    try: 
     data = s.loads(token) 
    except: 
     raise ValidationError() 
    user_id = data['reset'] 
    .... 

И в модели пользователя, нам нужно изменить метод reset_password():

models.py

class User(UserMixin, db.Model): 
    __tablename__ = 'users' 

    ... 

    def reset_password(self, new_password): 
     self.password = new_password 
     db.session.add(self) 
     return True 
1

Для 1- На уровне безопасности может быть приятным преимуществом для ваших пользователей, чтобы скрыть, у кого есть учетные записи на вашем сайте. например, можно сказать, что это был сайт анонимных анонимных пользователей, если бы я хотел посмотреть, был ли член [email protected], я просто попробую сбросить пароль, чтобы подтвердить, что она является участником.

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

+0

Ну, теперь, когда вы упомянули об этом, это правда! Я не думал об этом –

+0

Я изменил весь вопрос, знаете ли вы, как это можно сделать? –

Смежные вопросы