7

webapp2 文档中没有提到SameSite为 cookie 设置属性,它似乎是基于 WebOB 的响应处理程序构建的,我检查了 webOB 文档页面,它清楚地显示了“SameSite”标志作为接受的 cookie 参数

尽管如此,我还是尝试在 set cookie 中设置它:

self.response.set_cookie(name, secure_cookie, path='/', secure=True,
httponly=True, samesite='lax', expires=expireDate)

但我收到以下错误:

TypeError: set_cookie() got an unexpected keyword argument 'samesite'

我知道可以使用self.response.headers.add_header('Set-Cookie', ...,但我希望我可以self.response.set_cookie按照 webapp2 文档使用

4

2 回答 2

4

Samesitewebob 1.8中引入,但 App Engine 标准环境 SDK 附带1.1.1 和 1.2.3作为内置库。

您可以尝试更新最近webob的版本,看看这是否会覆盖内置版本。

一旦安装了webob该支持的版本,就可以将关键字参数传递给samesitesamesiteResponse.set_cookie

class MyHandler(webapp2.RequestHandler):
    def get(self):
        self.response.set_cookie('cookie-name', value='42', samesite='lax')

此示例应用程序设置samesite=strict由 生成的会话 cookie webapp2_extras.sessions,假设底层 webob 包支持它。

import webapp2
from webapp2_extras import sessions


class HelloHandler(webapp2.RequestHandler):
    def dispatch(self):
        self.session_store = sessions.get_store(request=self.request)
        try:
            super(HelloHandler, self).dispatch()
        finally:
            self.session_store.save_sessions(self.response)

    @webapp2.cached_property
    def session(self):
        return self.session_store.get_session()

    def get(self):
        self.session['hello'] = 'world'
        self.response.headers['content-type'] = 'text/plain'
        self.response.write('Hello world')


webapp2_config = { 
    'webapp2_extras.sessions': {
        'secret_key': 's3cr3t',
        'cookie_args':{'samesite': 'strict'}
    },  
}

application = webapp2.WSGIApplication([
    webapp2.Route(r'/', handler=HelloHandler),
],
    config=webapp2_config)

响应的set-cookie标题是

session=eyJoZWxsbyI6IndvcmxkIn0=|1595151290|09b22484901689e6eb0411792c8732ef134d2b66; Path=/; SameSite=strict
于 2019-04-06T12:32:38.290 回答
1

我通过标题更改解决了这个问题,没有安装任何外部库。只需在设置 cookie 后使用此功能:

def AddSameSiteToCookies(self):
    for index, header in enumerate(self.response.headers._items):
        if header[0] == "Set-Cookie" and "SameSite" not in header[1]:
            temp = list(header)
            temp[1] = temp[1].replace("Path=", "SameSite=Lax; Path=")
            self.response.headers._items[index] = tuple(temp)
于 2020-10-13T14:12:15.093 回答