我正在努力在flask中实现双因素身份验证,其中用户选择以下三种方式之一进行身份验证:使用FreeOtp进行TOTP,通过电子邮件进行HOTP以及安全性问题。我目前正在使用两个视图函数。一个获取他们的电子邮件和密码,另一个获得另一个认证因素。如果用户输入了正确的电子邮件和密码,我将他们的电子邮件和时间戳存储在会话变量中,并将它们发送到正确的功能以及它们的身份验证类型,如下所示:
if user.otp_secret is not None:
session['email'] = user.email
session['email_time'] = datetime.now()
return redirect(url_for('userbp.token'))
elif user.use_questions:
session['email'] = user.email
session['email_time'] = datetime.now()
return redirect(url_for('userbp.questions'))
然后在下一个视图函数中,我验证这些会话变量已设置,并且时间戳小于五分钟,如下所示:
if 'email_time' not in session or 'email' not in session:
#Ensure proper sessions were created at first authenitcation
if 'email' in session:
del session['email']
if 'email_time' in session:
del session['email_time']
abort(404)
if session['email_time'] < datetime.now() - timedelta(minutes=5):
#Ensure that first authentication took place in the last five minutes
del session['email']
del session['email_time']
flash('The login cookie has expired. Please try again', 'negative')
return redirect(url_for('userbp.signin'))
user = User.query.filter_by(email=session['email']).first()
if user is None:
abort(404)
从这里开始,我将根据用户选择的方法对用户进行身份验证。
我的问题是烧瓶会话变量是否足够安全以这种方式处理身份验证,如果不是,我怎么能安全地将用户信息传递到下一个视图。如果用户能够编辑会话变量,他们将能够通过第一次身份验证而无需知道密码。我考虑的其他事情是使用加密的URL令牌,可以在其他视图中解密。这会更安全吗?如果没有,我怎么能处理它更安全。