问题描述
我构建了一个Chrome扩展程序,可将网络内容保存到我的Rails应用程序中。最初,只要在我的API控制器上打开了CORS设置,我就能够依靠现有的Rails / Devise用户会话来确保将内容保存到正确的用户。只要用户已登录,无论使用该扩展程序在哪个站点上,从Chrome扩展程序到我网站的AJAX调用都将得到正确的身份验证。
但是,在2020年初,Chrome对他们处理跨站点请求的方式进行了更改(请参见here,here和here)。具体来说,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 (将#修改为@)