python - Flask中的用户确认问题
ringa_lee
ringa_lee 2017-04-18 09:55:31
0
1
416

在学习Flask-Web开发这本书的第八章遇到了问题,就是在数据库模型中添加确认用户账户的功能时,有这样一段代码:

class User(UserMixin,db.Model):

__tablename__ = 'users'
id = db.Column(db.Integer,primary_key=True)
email = db.Column(db.String(64),unique=True,index=True)
username=db.Column(db.String(64),unique=True,index=True)
role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))
password_hash = db.Column(db.String(128))
confirmed = db.Column(db.Boolean,default=False)

@property
def password(self):
    raise AttributeError('password is not a readable attribute.')

@password.setter
def password(self,password):
    self.password_hash =generate_password_hash(password)

def verify_password(self,password):
    return check_password_hash(self.password_hash,password)

def generate_confirmation_token(self,expiration=3600):
    s=Serializer(current_app.config['SECRET_KEY'],expiration)
    return s.dumps({'confirm':self.id})

def confirm(self,token):
    s=Serializer(current_app.config['SECRET_KEY'])
    try:
        data=s.loads(token)
    except:
        return False 
    if data.get("confirm") != self.id:
        return False
    self.confirmed = True
    db.session.add(self)
    db.session.commit()
    return True

def __repr__(self):
    return '<User %r>' % self.username

confirm()方法验证令牌。
其中,有一段是这样的:if data.get("confirm") != self.id,正常情况下data返回的不就是原数据么({'confirm':self.id}),加这段代码的意义是什么
书中有解释:confirm()方法还检查令牌中的id是否和存储在current_user中的已登录用户匹配。这里的current_user是否就是指正在进行验证的这个用户?对于Flask来说,尚未确认的用户也算已登录的用户吗,即current_user.is_authentiacated为True。将代码改为

          if data.get("confirm") != current_user.get_id():

可否?

以及最后一句话,添加这段代码:if data.get("confirm") != self.id,即使恶意用户知道如何生成签名令牌,也无法确认别人的账户。账户应该是指注册或者登录时的email吧,这段代码确认了confirm数据是否为用户唯一id号,和用户账户(email)有什么关系

ringa_lee
ringa_lee

ringa_lee

모든 응답(1)
Ty80

으아악

여기서 주목해야 할 것은 tokenSECRET_KEY입니다.

여기의 데이터는 data=s.loads(token) 한 번 통과되었습니다. 토큰과 SECRET_KEY가 올바르지 않으면 get에서 얻은 ID도 올바르지 않아 이를 확인하는 역할을 합니다.

여기서 계정은 각 계정의 고유 ID를 의미합니다. 악의적인 사용자가 토큰 위조에 성공하더라도 사용자의 ID 번호가 올바르지 않아 여기서는 성공적으로 확인할 수 없습니다.

로그인과 확인은 두 가지 속성입니다. 둘 사이에는 결합 관계가 없습니다. 로그인되지 않은 계정도 확인할 수 있으므로 확인되지 않은 계정도 로그인될 수 있습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!