2015-05-09 66 views
2

我正在一个项目(不是任何合作项目,学术)我正在使用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需要一些用户属性并发出令牌的随机安全字符串。

+1

你是说你每次服务器启动时都会创建一个新的应用程序密钥? –

+0

@MartijnPieters HoHoly s ***!这就是问题所在?是的,我不保存它!我应该现在把它保存在ENV中! – user2290820

+0

@MartijnPieters谢谢指出! – user2290820

回答

6

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

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

不要那样做。创建一个为您的应用程序的秘密,并始终贯穿始终。您的密钥是使用此服务器端秘密签名的,然后当cookie从浏览器返回时,再次用于验证内容未被更改。

如果您每次更改密码,先前生成的cookie总是会失效,因为它们不会匹配新密码。

存储您的应用程序配置的秘密。

+0

谢谢。这清除了我的概念 – user2290820