如何修复 itsdangerous.BadTimeSignature 签名错误
How to fix itsdangerous.BadTimeSignature Signature Error
我正在做一个项目(不是任何合作项目,学术项目)我在使用 flask-login 中的 itsdangerous 和登录管理器时遇到了问题。
我创建了注册表单。输入我的名字电子邮件和密码然后什么时候
我重新启动服务器,我得到这个:
```
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 alchemy 模型中定义了用户模型:
Base=declarative_base()
使用class方法
get_auth_token(self):
return login_serializer.dumps([str(self.id_), self.email, self.pwd])
登录序列化程序基于:
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)
影响从 User 模型生成的令牌,以及为什么它要检查路由的匹配项,例如“/”或任何随机数可以访问的任何路由。
是否需要设置权限限制,让登录管理器不检查每条路由?
据我所知,正在生成替代令牌,以便更安全地将会话 cookie 绑定到服务器端 cookie,因为将比较服务器端 cookie 信息,这可以根据 get_auth_token 看出,这需要一些时间用户属性并给出令牌的随机安全字符串。
您每次都在此处创建一个新密文:
from itsdangerous import URLSafeTimedSerializer
app.secret_key = gen_random_key()
login_serializer = URLSafeTimedSerializer(app.secret_key)
不要那样做。为您的应用程序创建 one 密钥,并始终使用它。您的密钥使用此服务器端机密进行签名,然后当 cookie 从浏览器发回时,再次用于验证内容是否未更改。
如果您每次都更改密码,之前生成的 cookie 将始终无效,因为它们与新密码不匹配。
将密钥与您的应用程序配置一起存储。
我正在做一个项目(不是任何合作项目,学术项目)我在使用 flask-login 中的 itsdangerous 和登录管理器时遇到了问题。
我创建了注册表单。输入我的名字电子邮件和密码然后什么时候 我重新启动服务器,我得到这个:
```
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 alchemy 模型中定义了用户模型:
Base=declarative_base()
使用class方法
get_auth_token(self):
return login_serializer.dumps([str(self.id_), self.email, self.pwd])
登录序列化程序基于:
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)
影响从 User 模型生成的令牌,以及为什么它要检查路由的匹配项,例如“/”或任何随机数可以访问的任何路由。
是否需要设置权限限制,让登录管理器不检查每条路由?
据我所知,正在生成替代令牌,以便更安全地将会话 cookie 绑定到服务器端 cookie,因为将比较服务器端 cookie 信息,这可以根据 get_auth_token 看出,这需要一些时间用户属性并给出令牌的随机安全字符串。
您每次都在此处创建一个新密文:
from itsdangerous import URLSafeTimedSerializer
app.secret_key = gen_random_key()
login_serializer = URLSafeTimedSerializer(app.secret_key)
不要那样做。为您的应用程序创建 one 密钥,并始终使用它。您的密钥使用此服务器端机密进行签名,然后当 cookie 从浏览器发回时,再次用于验证内容是否未更改。
如果您每次都更改密码,之前生成的 cookie 将始终无效,因为它们与新密码不匹配。
将密钥与您的应用程序配置一起存储。