2016-03-15 50 views
-1

我目前正在通過Miguel Grinberg的書學習Flask。如果你熟悉你可能知道我目前在第8 Flasky(米格爾書過程中使用的應用程序)通過其危險標記獲取用戶信息

,處理密碼重置,這裏的原代碼(你也可以找到它的回購。它的標籤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}中。

問題是令牌管理邏輯位於用戶模型中。因此,有一個電子郵件字段的形式爲後來發現在認爲用戶不會在當前版本

的伎倆因爲你在這個觀點的原因,我們可以在邏輯移動到視圖:

AUTH /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

我改變了整個問題,你有什麼線索怎麼能做到這一點? –

相關問題