用户认证章节真够长的,不过涉及到的内容确实多,继续上一章节
这部分讲到的是新用户注册以后,需要在邮箱里面点击链接进行确认,这个在我们平时网站注册新用户的时候,经常会碰到
确认邮件中最简单的确认链接是http://www.example.com/auth/confirm/<id> 这种形式的URL,其中id 是数据库分配给用户的数字id。用户点击链接后,处理这个路由的视图函
数就将收到的用户id 作为参数进行确认,然后将用户状态更新为已确认。但这种实现方式显然不是很安全,只要用户能判断确认链接的格式,就可以随便指定URL中的数字,从而确认任意账户。解决方法是把URL 中的id 换成将相同信息安全加密后得到的令牌。
(venv) $ python manage.py shell
>>> from manage import app
>>> from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
>>> s = Serializer(app.config['SECRET_KEY'], expires_in = 3600) #expires_in表示这个秘钥令牌的有限时间是多久,秒为单位
>>> token = s.dumps({ 'confirm': 23 }) #dumps表示将{'confirm':23}转化成安全令牌
>>> token
'eyJhbGciOiJIUzI1NiIsImV4cCI6MTM4MTcxODU1OCwiaWF0IjoxMzgxNzE0OTU4fQ.ey ...'
>>> data = s.loads(token) #loads则表示解析这个令牌,等于反向解码
>>> data
{u'confirm': 23}
接着,有了这个验证的东西,我们起码要为我们的模型添加这样一个属性
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)