如何解决它的危险.BadTimeSignature签名错误

use*_*820 2 python cookies flask flask-sqlalchemy flask-login

我正在研究一个项目(不是任何合作项目,学术)我在使用其登录时的危险和登录管理器时遇到了麻烦.

我创建了一个注册表单.输入我的名字电子邮件和密码然后当我重新启动服务器时,我得到了这个:

```
itsdangerous.BadTimeSignature
BadTimeSignature: Signature 'GAMjfzQpbKlPraWesdT49W40pA8' does not match
```
Run Code Online (Sandbox Code Playgroud)

错误的流程是这样的:

return render_template('index.html')
  ctx.app.update_template_context(context)
    context.update(func())
 return dict(current_user=_get_user())
  current_app.login_manager._load_user()
    return self._load_from_cookie(request.cookies[cookie_name])
 user = self.token_callback(cookie)
line 93, in load_token
    data = login_serializer.loads(token, max_age=max_age)
.unsign(s, max_age, return_timestamp=True)
in unsign
    date_signed=timestamp)
BadTimeSignature: Signature 'GAMjfzQpbKlPraWesdT49W40pA8' does not match
Run Code Online (Sandbox Code Playgroud)

问题的根源在主应用程序运行文件中:

line 93, in load_token
    data = login_serializer.loads(token, max_age=max_age)

@login_manager.token_loader
def load_token(token):
    max_age = app.config["REMEMBER_COOKIE_DURATION"].total_seconds()

    #decrypt token
    data = login_serializer.loads(token, max_age=max_age)

    user = find-and-get-user-object(data)
    if user:
        if data[2] == users password: return user object
    return None
Run Code Online (Sandbox Code Playgroud)

app.config ["REMEMBER_COOKIE_DURATION"]设置为

app.config["REMEMBER_COOKIE_DURATION"] = some timedelta days
Run Code Online (Sandbox Code Playgroud)

从DateTime导入时间增量的位置.

模型文件具有在sql alchemy Model中定义的用户模型:

Base=declarative_base()
Run Code Online (Sandbox Code Playgroud)

用类方法

get_auth_token(self):
        return login_serializer.dumps([str(self.id_), self.email, self.pwd])
Run Code Online (Sandbox Code Playgroud)

登录序列化程序基于:

from itsdangerous import URLSafeTimedSerializer
app.secret_key = gen_random_key()
login_serializer = URLSafeTimedSerializer(app.secret_key)
Run Code Online (Sandbox Code Playgroud)

没有登录管理器,提交路由正在运行.

我想知道load_token()函数行是怎么回事:

    data = login_serializer.loads(token, max_age=max_age)
Run Code Online (Sandbox Code Playgroud)

影响从用户模型生成的令牌,以及为什么要检查路由上的匹配,比如'/'或任何随机可以访问的路由.

我是否需要设置权限限制,以便将登录管理器设置为不检查每条路由?

正如我所理解的那样生成备用令牌以更安全地将会话cookie绑定到服务器端cookie,因为将比较服务器端cookie信息,这可以基于get_auth_token看到,get_auth_token接受一些User属性并发出随机安全字符串对于一个令牌.

Mar*_*ers 6

您每次都在创建一个新秘密:

from itsdangerous import URLSafeTimedSerializer
app.secret_key = gen_random_key()
login_serializer = URLSafeTimedSerializer(app.secret_key)
Run Code Online (Sandbox Code Playgroud)

不要那样做.为您的应用程序创建一个秘密,并始终使用它.您的密钥使用此服务器端密钥进行签名,然后在从浏览器发回cookie时再次使用,以验证内容是否未更改.

如果您每次都更改密码,以前生成的cookie将始终无效,因为它们与新密码不匹配.

使用您的应用程序配置存储密钥.