我将首次进入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,而不是一个。除了一个区别外,这两个Cookie都是相同的(名称都为“auth_tkt”):一个 cookies 的主机值为“.www.mydomain.com”,另一个 cookies 的主机值为“www.mydomain.com”。为什么设置了2个cookie,而不是一个?差异主机值的意义是什么?

问题2,网络工具报告说两种cookie都不安全。我该怎么做以确保cookie是安全的?

问题3:两个cookie的到期值均为“在 session 结束时”。这是什么意思,我该如何自定义到期值?建议的登录cookie到期时间的做法是什么?

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

最佳答案

  • 实际上,会生成3个cookie。一个不带Domain key ,一个带ojit,第三个带域的通配符版本(前导点)。您的浏览器通常将两者合并或忽略其中之一(这因浏览器而异,这就是设置2的原因)。

    最后一个cookie是在wild_domain上设置AuthTktAuthenticationPolicy选项时生成的(默认为True)。参见 AuthTktAuthenticationPolicy API。如果要在不同的子域之间共享身份验证cookie,则需要此(想想app1.domain,app2.domain);如果没有通配符cookie,您的浏览器将不会在子域之间共享cookie。
  • 您需要在cookie的身份验证策略上设置secure选项,以获取安全标志集。同样,请参见API
  • 未设置有效期限,这意味着在您关闭浏览器(浏览器显示的 session 结束)时,将删除cookie。如果您希望用户在关闭浏览器时注销,则将其保留为默认设置。

    仅当您希望 session 在整个浏览器关闭期间都可以持续时,设置cookie的最长使用期限,请参阅API中的max_age选项。此选项将使浏览器将cookie存储在磁盘上,以在两次关闭浏览器之间保持不变,并在超过最长使用期限后将其删除。

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

    有关如何配置它的更多详细信息,请参见API documentation中的timeoutreissue_time选项。
  • 策略对象需要请求中的几条信息才能生成cookie,尤其是服务器的所有主机名。
  • 10-07 19:16
    查看更多