我将首次进入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。难道不应该在响应对象上记住数据,而不是在请求对象上记住数据吗?
最佳答案
Domain
key ,一个带ojit,第三个带域的通配符版本(前导点)。您的浏览器通常将两者合并或忽略其中之一(这因浏览器而异,这就是设置2的原因)。最后一个cookie是在
wild_domain
上设置AuthTktAuthenticationPolicy
选项时生成的(默认为True)。参见 AuthTktAuthenticationPolicy
API。如果要在不同的子域之间共享身份验证cookie,则需要此(想想app1.domain,app2.domain);如果没有通配符cookie,您的浏览器将不会在子域之间共享cookie。 secure
选项,以获取安全标志集。同样,请参见API。 仅当您希望 session 在整个浏览器关闭期间都可以持续时,设置cookie的最长使用期限,请参阅API中的
max_age
选项。此选项将使浏览器将cookie存储在磁盘上,以在两次关闭浏览器之间保持不变,并在超过最长使用期限后将其删除。请注意,
AuthTktAuthenticationPolicy
策略对象可以通过限制将任何身份验证cookie视为有效的时间来更细粒度地管理登录 session ,并允许您设置cookie刷新策略。有了这样的刷新策略,用户在继续使用您的应用程序时会收到新的(刷新的)Cookie,但是如果他们在设定的时间内未连接到您的服务器,则他们的Cookie被认为是无效的,并且重新登录。有关如何配置它的更多详细信息,请参见API documentation中的
timeout
和reissue_time
选项。