8

我第一次涉足 Pyramid 安全模块。我正在使用此登录代码来设置 auth_tkt:

@view_config(route_name='LoginForm', request_method='POST', renderer='string')
class LoginForm(SimpleObject):
    def __call__(self):

        emailAddress = self.request.params.get('emailAddress')
        password = self.request.params.get('password')

        if emailAddress != 'testemail@gmail.com' or password != 'testpassword':
            errorDictionary = { 'message' : "Either the email address or password is wrong." }
            self.request.response.status = 400
            return json.dumps( errorDictionary, default=json_util.default)

        testUserGUID = '123123123'

        headers = remember(self.request, testUserGUID)
        return HTTPOk(headers=headers)

它似乎工作正常,但有一些令人费解的细节:

首先,实际上设置了 2 个 cookie 而不是一个。这 2 个 cookie 是相同的(都具有名称“auth_tkt”),除了一个区别:一个的主机值为“.www.mydomain.com”,而另一个 cookie 的主机值为“www.mydomain.com” 为什么是设置 2 个 cookie 而不是 1 个?不同的主机值有什么意义?

问题 2,网络工具报告这两个 cookie 都不安全。我可以做些什么来确保 cookie/s 是安全的?

问题 3:两个 cookie 的过期值都是“在会话结束时”。这是什么意思,我如何自己自定义到期值?登录 cookie 过期时间的推荐做法是什么?

问题4:我不明白为什么“remember”的第一个参数是self.request而不是self.request.response。不应该在响应对象而不是请求对象上记住数据吗?

4

1 回答 1

11
  1. 实际上,生成了 3 个 cookie;一个没有Domain密钥,一个有,第三个带有您的域的通配符版本(前导点)。您的浏览器通常要么合并两者,要么忽略其中之一(哪一个因浏览器而异,这就是设置 2 的原因)。

    当该wild_domain选项设置为AuthTktAuthenticationPolicy(默认为 True)时,会生成最后一个 cookie;见AuthTktAuthenticationPolicyAPI。如果您的身份验证 cookie 要在不同的子域之间共享(想想 app1.domain、app2.domain),则需要这个;您的浏览器不会在没有通配符 cookie 的情况下跨子域共享 cookie。

  2. 您需要在securecookie 的身份验证策略上设置选项以设置安全标志。再次,请参阅API

  3. 没有设置过期时间,这意味着当您关闭浏览器时 cookie 将被删除(浏览器向您显示的会话结束)。如果您希望您的用户在关闭浏览器时注销,请将其保留为默认值。

    当您希望会话在浏览器关闭期间持续存在时,才设置 cookie 最大期限,请参阅APImax_age中的选项。此选项将导致浏览器将 cookie 存储在磁盘上,以在浏览器关闭之间持续存在,并在最长期限过后将其删除。

    请注意,AuthTktAuthenticationPolicy策略对象可以通过限制将任何身份验证 cookie 视为有效的时间长度来以更细粒度的方式管理登录会话,并允许您设置 cookie 刷新策略。有了这样的刷新策略,用户将在继续使用您的应用程序时收到新的(刷新的)cookie,但如果他们没有在设定的时间段内连接到您的服务器,他们的 cookie 将被视为无效,他们将重新登录。

    有关如何配置的更多详细信息,请参阅API 文档timeout中的和reissue_time选项。

  4. 策略对象需要请求中的几条信息才能生成 cookie,尤其是服务器的所有主机名。

于 2012-09-02T08:52:14.697 回答