zak*_*ces 8 python security cookies pylons 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)
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常,但有一些令人费解的细节:
首先,实际上有两个cookie而不是一个.2个cookie是相同的(两者都是名称"auth_tkt"),除了一个区别:一个主机值为".www.mydomain.com",而另一个cookie主机值为"www.mydomain.com"为什么设置2个cookie而不是一个?主机价值差异有什么意义?
问题2,网络工具报告说两个cookie都不安全.我该怎么做才能确保cookie/s安全?
问题3:两个cookie的到期值均为"会话结束时".这是什么意思,我如何自己定制到期值?登录cookie到期时间的推荐做法是什么?
问题4:我不明白为什么"记住"的第一个论点是self.request而不是self.request.response.不应该在响应对象上记住数据,而不是请求对象吗?
Mar*_*ers 11
实际上,生成了3个cookie; 一个没有Domain密钥,一个没有密钥,第三个没有你的域的通配符版本(领先的点).您的浏览器通常要么合并两者,要么忽略其中一个(哪个是浏览器不同,这就是设置2的原因).
当wild_domain选项设置在AuthTktAuthenticationPolicy(默认为True)时生成最后一个cookie ; 看到AuthTktAuthenticationPolicyAPI.如果您的身份验证cookie要在不同的子域之间共享,则需要这样做(想想app1.domain,app2.domain); 如果没有通配符cookie,您的浏览器将不会跨子域共享cookie.
您需要secure在您的身份验证策略中为cookie 设置选项以获取安全标志集.再次,请参阅API.
没有设置过期,这意味着当您关闭浏览器时会删除cookie(浏览器显示的会话结束).如果您希望用户在关闭浏览器时注销,请将其保留为默认值.
仅当您希望会话跨浏览器闭包时,设置cookie最大年龄,请参阅API中的max_age选项.此选项将导致浏览器将cookie存储在磁盘上以在浏览器闭包之间保留,并在最大年龄过去时删除它们.
请注意,AuthTktAuthenticationPolicy策略对象可以通过限制认为任何身份验证cookie有效的时间来以更细粒度的方式管理登录会话,并允许您设置cookie刷新策略.有了这样的刷新策略,用户将在继续使用您的应用程序时收到新的(刷新的)cookie,但如果他们在一段时间内没有连接到您的服务器,他们的cookie将被视为无效,他们将拥有再次登录
有关如何配置它的更多详细信息,请参阅API文档中的timeout和reissue_time选项.
策略对象需要来自请求的多条信息才能生成cookie,尤其是服务器的所有主机名.