我正在一个项目(不是任何合作项目,学术)我正在使用flask-login使用其危险和登录管理器的麻烦。如何解决它的危险.BadTimeSignature签名错误
我创建了一个注册表单。当 我重新启动服务器中输入我的名字电子邮件地址和密码,然后,我得到这个:
```
itsdangerous.BadTimeSignature
BadTimeSignature: Signature 'GAMjfzQpbKlPraWesdT49W40pA8' does not match
```
错误的流程是这样的:
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
的问题的根源是在这里的主要应用程序运行的文件:
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
的app.config [ “REMEMBER_COOKIE_DURATION”]被设定为
app.config["REMEMBER_COOKIE_DURATION"] = some timedelta days
其中时间增量是从DateTime导入的。
模型文件具有在SQL炼金术模型中定义的用户模型:
get_auth_token(self):
return login_serializer.dumps([str(self.id_), self.email, self.pwd])
登录串行器是基于
Base=declarative_base()
与类方法:
from itsdangerous import URLSafeTimedSerializer
app.secret_key = gen_random_key()
login_serializer = URLSafeTimedSerializer(app.secret_key)
在不提交路由的登录管理器正在工作。
我想知道的是如何load_token()函数行:
data = login_serializer.loads(token, max_age=max_age)
影响从用户模型生成的令牌,它为什么要在一个路由检查匹配,说“/”或任何途径任何随机可以访问的地方。
我是否需要设置权限限制以设置登录管理器不检查每条路径?
正如我所了解的,正在生成另一个令牌,以便将会话cookie更安全地绑定到服务器端Cookie,因为服务器端Cookie信息将与基于get_auth_token的get_auth_token进行比较,该get_auth_token需要一些用户属性并发出令牌的随机安全字符串。
你是说你每次服务器启动时都会创建一个新的应用程序密钥? –
@MartijnPieters HoHoly s ***!这就是问题所在?是的,我不保存它!我应该现在把它保存在ENV中! – user2290820
@MartijnPieters谢谢指出! – user2290820