如果用户/设备在过去30天内登录,是否希望django双因素身份验证跳过令牌步骤

如果用户/设备在过去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

首先,如果有人这样做,请告知:)

现在,我正在考虑子类化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):
       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的人使用。我认为它使所有其他方法过时,并将成为各地的标准