如果用户/设备在过去30天内登录,是否希望django双因素身份验证跳过令牌步骤
首先,如果有人这样做,请告知:) 现在,我正在考虑子类化LoginView方法get\u context\u data()(从包中) 新方法的第一行是:如果用户/设备在过去30天内登录,是否希望django双因素身份验证跳过令牌步骤,django,two-factor-authentication,Django,Two Factor Authentication,首先,如果有人这样做,请告知:) 现在,我正在考虑子类化LoginView方法get\u context\u data()(从包中) 新方法的第一行是: if self.steps.current == 'token': (pseudo code) if user_agent == current user_agent and last_activity < 30 days ago (from table user_sessions_session): re
if self.steps.current == 'token':
(pseudo code)
if user_agent == current user_agent and last_activity < 30 days ago (from table user_sessions_session):
return context # skip the token step
如果self.steps.current=='token':
(伪代码)
如果用户\u代理==当前用户\u代理和上次\u活动<30天前(从表用户\u会话\u会话):
返回上下文#跳过标记步骤
我看到这是一个尚未实现的库我对存储库进行了更改,并将其放入了一个。您可以查看更改(更改的覆盖率为100%) 基本上,如果存在有效的登录(使用令牌),它会将签名cookie设置为仅限于登录页面。之后的登录将检查签名的cookie,如果它存在且未过期,则允许在没有令牌的情况下登录。这是关键逻辑:
def token_required(self, request):
"""
if this user logged with a token in the last {{TWO_FACTOR_TRUSTED_DAYS}}
days, they can skip the token steps.
"""
end_valid_login = None
if not request.COOKIES.get('evl'):
return True
try:
end_valid_login = request.get_signed_cookie('evl',
salt=settings.TWO_FACTOR_SALT)
except (BadSignature, SignatureExpired) as e:
return True
end_valid_login_dt = datetime.strptime(end_valid_login, '%Y-%m-%d')
if datetime.today() < end_valid_login_dt:
#--- the cookie is valid and still within {{TWO_FACTOR_TRUSTED_DAYS}} ---#
return False
else:
return True
def令牌_所需(自身、请求):
"""
如果此用户在最近{2天{u因子}内使用令牌登录
天,他们可以跳过标记步骤。
"""
结束\u有效\u登录=无
如果不是请求.COOKIES.get('evl'):
返回真值
尝试:
end\u valid\u login=request.get\u signed\u cookie('evl',
盐=设置。双因素(盐)
除(不良签名、签名已签名)外,e:
返回真值
end\u valid\u login\u dt=datetime.strtime(end\u valid\u login,%Y-%m-%d')
如果datetime.today()
注意:(编辑2020年3月)
事实上,我建议任何实现2FA的人使用。我认为它使所有其他方法过时,并将成为各地的标准