Flask学习总结笔记(11) -- 利用itsdangerous实现用户身份确认
2017-01-18 16:40
337 查看
当用户注册后,Web服务需要提供一个身份真实性认证的过程,比如发送确认邮件等等。只有用户点击了确认的邮件,注册的账号才能被激活。
我们可以将
TimedJSONWebSignatureSerializer类生成的是具有过期时间的JSON Web签名。expiration_in参数设置令牌的过期时间,单位为秒。
上面发送邮件的过程参见我以前的博客:Flask学习总结笔记(8) – 利用Flask-mail实现电子邮件发送功能。
我们可以将
http://www.site.com/auth/conmfirm/id的激活链接方式作为邮件内容发送给注册者,其中id是数据库分配给注册用户的自增编号。但是这种方式很不安全,恶意者可以伪造id值。因此,我们需要对信息进行加密处理,将id换成携带身份信息的令牌值。Flask使用加密的签名cookie保护用户会话,这种安全的cookie使用的是itsdangerous 包。同样地,我们也可以用itsdangerous 来生成携带用户信息的安全令牌。
0x01 相关函数
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer #生成确认的confirm链接token信息 def generate_confirm_token(self, expiration_in =3600): s=Serializer(current_app._get_current_object().config['SECRET_KEY'], expiration_in) return s.dumps({'confirm':self.id})
TimedJSONWebSignatureSerializer类生成的是具有过期时间的JSON Web签名。expiration_in参数设置令牌的过期时间,单位为秒。
0x02 发送验证邮件
在auth/views.py视图文件中,添加发送携带验证token的邮件给注册用户:
#用户注册 @auth.route('/register/',methods=['POST','GET']) def register(): if current_user.is_authenticated: return redirect('main.index') form=RegisterForm() if form.validate_on_submit(): user=Users(username=form.username.data, email=form.email.data, password=form.password.data) db.session.add(user) db.session.commit() #发送邮件(产生token) token=user.generate_confirm_token() from app.email import sendMail emails=[] emails.append(user.email) sendMail.send_mail(u'激活您注册的账号',emails,'email/active.html',user=user,token=token) flash(u' 一封激活账号的邮件已经发送到您的注册有相中') return redirect(url_for('auth.login')) return render_template('auth/register.html',form=form)
上面发送邮件的过程参见我以前的博客:Flask学习总结笔记(8) – 利用Flask-mail实现电子邮件发送功能。
0x03 验证确认过程
在auth/views.py文件中,定义用户点击的url的处理过程:
#账号激活处理 @auth.route('/confirm/<token>') @login_required def confirm(token): if current_user.confirmed: return redirect('main.index') if current_user.confirm(token): flash(u'您的账号已被激活') else: flash(u'访问链接非法') return redirect(url_for('main.index'))
相关文章推荐
- 类成员C++笔记六:static类成员总结,以及利用C++类static成员实现单例模式
- Flask学习总结笔记(10) -- 利用Werkzeug实现账号密码加密存储
- Flask学习总结笔记(8) -- 利用Flask-mail实现电子邮件发送功能
- Android基础学习总结(十二)——利用Bmob实现用户账户体系(注册、登录、验证等)
- 数据结构与算法分析笔记与总结(java实现)--数组11:数组中的逆序对(﹡)
- 利用ListActivity,CursorAdapter获取用户输入(短信群发器的地址输入实现)总结
- Flask学习总结笔记(9) -- 利用Flask-Login维护用户登录状态
- 数据结构与算法分析笔记与总结(java实现)--字符串11:合法括号序列判断练习题
- 数据结构与算法分析笔记与总结(java实现)--排序11:有序矩阵查找练习题
- 利用SQLSERVER存储过程实现ASP用户身份验证
- 数据结构与算法分析笔记与总结(java实现)--链表11:链表按值分化问题
- 【图解HTTP笔记】第八章 确认用户的身份
- C++笔记六:static类成员总结,以及利用C++类static成员实现单例模式
- 利用SQLSERVER存储过程实现ASP用户身份验证
- 孙鑫VC学习笔记:第十六讲 利用关键代码段实现线程间的同步
- 利用HttpModule和forms身份验证,实现角色验证控制
- 利用IFRAME 让每个页面都继承菜单控 不是用户自定义控件来实现的
- 利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆
- 利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆