【问题标题】:Webapp2 Python set_cookie does not support samesite cookie?Webapp2 Python set_cookie 不支持同站点cookie?
【发布时间】:2019-08-28 03:11:41
【问题描述】:

webapp2 documentation 中没有提到为cookie 设置SameSite 属性,它似乎是建立在WebOB 的响应处理程序上的,我检查了webOB 文档页面,它清楚地显示了'SameSite' flag as an accepted cookie parameter

我还是尝试在 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', ...,但我希望我可以按照 webapp2 文档使用self.response.set_cookie

【问题讨论】:

    标签: python google-app-engine cookies webapp2 webob


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      Samesite 是在 webob 1.8 中引入的,但 App Engine 标准环境 SDK 附带 1.1.1 and 1.2.3 作为内置库。

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

      一旦安装了支持samesitewebob 版本,就可以将samesite 关键字参数传递给Response.set_cookie

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

      此示例应用在webapp2_extras.sessions 生成的会话cookie 上设置samesite=strict,假设底层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
      

      【讨论】:

      • 这太可悲了 :(!我认为不值得为缺少的标志导入底层库,听起来像是 GAE 应该做的事情,但我猜他们未来计划迁移到 Python3 和Flask 和 Django 等其他框架的可用性,他们可能会停止升级 webapp2 及其库。感谢您的提醒!然后我将使用 add_header 方法..
      • @Khaled 请您详细说明 add_header 方法吗?您将如何在 cookie 上设置 SameSite 属性?
      • 如果您的项目在 django 版本>2.1 中运行,如果版本不是您必须实现并且必须使用中间件设置标头,这将自动修复。link
      • @snakecharmerb 关于如何让 webapp2 使用较新版本的 webob 有什么建议吗?我厌倦了从供应商库中导入它,但没有运气。我正在使用 webapp2.extras 会话,它使用 set_cookie,因此使用 add_header 的解决方法非常棘手。
      • 我在 app.yaml.libraries 中使用 webapp2 v2.5.2 运行了这个示例,并使用了最新的 webob。(在这种情况下,无需在 app.yaml 中指定 webob)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2020-12-16
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多