2015-04-03 109 views
0

我了解Flask-login的方式是,一旦通过身份验证,它就会设置一个cookie,其中包含随每个请求一起发送的用户ID,以便服务器可以将请求与(登录)用户。用户ID几乎被编码为用户ID和一些浏览器设置(用户代理,我认为)的功能。使用flask-login确保单个用户每个帐户

由此产生了一些问题,也许有人可以对它们发表评论并提出解决方案。

  • 客户端可以通过猜测用户标识并使用相同的cookie编码功能来请求内容(如果它伪装成登录用户)。
  • 多个用户可以在两台不同的计算机共享帐户凭据时使用同一个用户帐户(我想限制这一点,但我想允许用户在一台计算机上打开同一会话的多个选项卡)。

我可以实现一个服务器端机制,该服务器端机制在身份验证时生成一个随机秘密令牌,并与用户记录一起存储,并成为会话cookie。我可以使用它来确保只有经过身份验证的用户才可以在单台机器上登录(希望一台机器上的多个选项卡仍在工作)。 flask-login是否已经包含这样的方法,并且这通常是一个好方法来满足我的需求?

+0

您可能想要将用户限制在单个会话中,但我希望听到我说:请不要。您应该将会话视为基础层(匿名用户),然后用户帐户在登录时链接到会话。临时状态应与会话关联,而不是用户帐户。许多网上商店已经这样做了:例如,每个会话中的购物车都是独立的。要“转移”购物车,许多网站都会让您保存购物车并在任何会话中重新打开。 – sleblanc 2015-04-03 11:28:47

+0

除了在URL和认证会话中编码的内容之外,我不必维护任何临时状态。这不适用于我的情况。 – orange 2015-04-03 13:56:18

回答

1

我最终做了我在我的问题中提出的建议。 (1)认证令牌将从会话cookie中提取,(2)该认证令牌的用户是查询,(3a)如果未发现访问被禁止并且显示登录页面,或者(3b) )返回请求的页面。

当用户登录,而不是调用login_user,我叫

def login_user_with_secret_session(user, remember=False, force=False): 
    auth_session_token = random.getrandbits(128) 
    auth_session_token = '%032x' % auth_session_token 
    # store `auth_session_token` in user table 
    set_user_auth_session_token(user, auth_session_token) 
    return login_user(user, remember=remember, force=force) 

另一个修改是login_manager.id_attribute = 'get_auth_session_token'

class User(Base, UserMixin): 
    __table__ = user_table 

    ... 

    def get_auth_session_token(self): 
     return self.auth_session_token 

flask-login返回认证令牌访问。

2

我还没有经过Flask-login's source,但正如你所说它使用Flask会话对象,这意味着Flask登录的这部分是安全的,因为session cookie is cryptographically signed to protect against forgery。 Flask称之为“SecureCookie支持的会话”。数据没有加密,但是由于它已被签名,用户可能不会对其进行修改。

这有一定的优势:

  • 存储实际会话的负担转移到客户端。无需将会话存储在数据库中。如果你有许多匿名用户并需要存储非临界状态,那将是非常好的。
  • 它应该是安全的
  • 通过使用浏览器扩展,或手动的,用户可以从一个设备转移他们的会话到另一个

但也有一些缺点:

  • 其他数据来回传送
  • 如果用户清除缓存,则会丢失所有会话数据。如果他们的设备崩溃,则相同。
  • 给定足够的时间,因为攻击者可以访问多个消息及其签名,所以理论上可以通过暴力猜测猜测您的密钥。

确保您的SECRET_KEY足够强大。

+0

哦,这是个好消息。所以安全的cookie支持的会话至少缓解了我的第一点(仍然可以复制编码的cookie并在另一台机器上使用它)。缺点不是问题; (1)足迹最小,(2)这是预期的行为,并且用户可以预期再次登录,(3)这也适用于任何其他加密方法。 – orange 2015-04-03 14:01:59

相关问题