使用跨站点Cookie从Chrome扩展程序发布到Rails API 关于飞行前选项请求的旁注:

问题描述

我构建了一个Chrome扩展程序,可将网络内容保存到我的Rails应用程序中。最初,只要在我的API控制器上打开了CORS设置,我就能够依靠现有的Rails / Devise用户会话来确保将内容保存到正确的用户。只要用户已登录,无论使用该扩展程序在哪个站点上,从Chrome扩展程序到我网站的AJAX调用都将得到正确的身份验证。

但是,在2020年初,Chrome对他们处理跨站点请求的方式进行了更改(请参见hereherehere)。具体来说,cookie的SameSite属性现在默认为“宽松”,而不是“无”,因此,要使用跨站点cookie,必须将cookie设置显式设置为SameSite=None; Secure

Rails自己的用户会话cookie没有SameSite=None; Secure设置,因此不再可以使用Rails会话来验证我的Chrome扩展程序的请求。

我的解决方法是,每当用户登录应用程序时都会生成我自己的API身份验证cookie,但确实应用了必要的SameSite=None; Secure。我能够使用此Cookie对我的Chrome扩展程序中的API调用进行身份验证,一切都很好。

然后在2020年9月上旬,它突然停止工作。 Rails不再从Chrome扩展程序请求中读取跨站点cookie。没有错误或警告,该值仅为null。

API控制器:

  # This gets called when user logs into app:
  def set_cross_site_cookie

    # NOTE: Won't work in dev because secure = true
    cookies[:foo_cookie] = {
      value: 'bar',expires: 1.year.from_now,same_site: :none,# Required in order to access from Chrome extension on different site
      secure: true # Required in order to access from Chrome extension on different site
    }
    cookie = cookies[:foo_cookie]
    render json: {cookie: cookie}

  end

  # This SHOULD work when called from our Chrome extension:
  def get_cross_site_cookie

    # Add headers to allow CORS requests
    # SEE: http://stackoverflow.com/questions/298745/how-do-i-send-a-cross-domain-post-request-via-javascript
    response.headers['Access-Control-Allow-Origin'] = '*'
    response.headers['Access-Control-Request-Method'] = %w{GET POST OPTIONS}.join(",")

    cookie = cookies[:foo_cookie]
    render json: {cookie: cookie}

  end

第5机架,第2.1机架 (注意:要使用选项same_site: none设置Rails cookie,您显然需要使用高于2.1.0的机架版本-SEE:https://github.com/rails/rails/pull/28297#issuecomment-600566751 >

有人知道发生了什么事吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)