基于两步验证的flask登录接口

两步验证

为了防止暴力破解,网站的登陆除了用户名和密码以外通常会有图形验证码等工具来验证,在安全性要求更高的网站(例如银行)会采用动态密码的形式(U盾)。
除了硬件token外,我们可以在手机上装上google authenticator等软件实现同样的功能。

基于flask的两步验证

我自己写了一个工具库,其中包含了两步验证的接口,使用方法如下:

在flask的登陆验证接口中,加入两步验证的步骤:

1
2
3
4
5
6
7
8
9
user = User.query.filter(User.username == form.username.data).first()
if user.verify_twostep(form.token.data):
if user.verify_password(form.password.data):
login_user(user, form.rememberme.data)
return redirect(request.args.get('next') or url_for('main.index'))
else:
flash('用户名或密码错误')
else:
flash("两步验证失败")

两步验证的方法是通过autils库来实现的:

1
2
3
4
5
from autils.authentication import TwoStepVerification

def verify_twostep(self, code):
ts = TwoStepVerification(self.username)
return ts.check(self.otp_str, code)

TwoStepVerification 是我自己写的一个工具,其中包含两个方法,一个get_qrcode_string方法用来获取生成二维码的字符,以方便google authenticator等软件扫码识别,另一个check方法用来验证用户输入的动态code是否合法。

数据库方面,只需要在user表中添加一个字段用于存储两步验证的密钥就可以了。

autils库可以在github上找到源码。

效果展示

可以看到,即使用户名和密码泄露,没有动态code依旧无法登陆,进一步提高了网站的安全性。