【问题标题】:How to fix itsdangerous.BadTimeSignature Signature Error如何修复 itsdangerous.BadTimeSignature 签名错误
【发布时间】:2015-07-20 08:23:57
【问题描述】:

我正在从事一个项目(不是任何合作项目,学术)我在使用来自烧瓶登录的危险和登录管理器时遇到问题。

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

```
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 Model中定义的用户模型:

Base=declarative_base()

类方法

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 看出,它采用一些用户属性并给出一个令牌的随机安全字符串。

【问题讨论】:

  • 您是说每次服务器启动时都在创建一个新的应用程序密码?
  • @MartijnPieters HoHoly s***!所以这就是问题所在?是的,我不保存它!我现在应该把它保存在 ENV 中!
  • @MartijnPieters 感谢您的指出!

标签: python cookies flask flask-sqlalchemy flask-login


【解决方案1】:

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

from itsdangerous import URLSafeTimedSerializer
app.secret_key = gen_random_key()
login_serializer = URLSafeTimedSerializer(app.secret_key)

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

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

将密钥与您的应用程序配置一起存储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 2020-08-31
    • 2020-04-13
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    相关资源
    最近更新 更多