Nil*_*ste 18 rest ruby-on-rails cross-domain devise cors
我正在开发一个应用程序,其中服务器和api消费客户端位于不同的域下,所以我想使用CORS.为此,我必须在服务器响应中设置相应的http标头:
def cors_set_access_control_headers
headers['Access-Control-Allow-Origin'] = 'http://localhost'
headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
headers['Access-Control-Allow-Headers'] = '*, X-Requested-With, X-Prototype-Version, X-CSRF-Token, Content-Type'
headers['Access-Control-Max-Age'] = "1728000"
end
Run Code Online (Sandbox Code Playgroud)
此方法用作before_filterin ApplicationController.
对于某些资源,用户必须经过身份验证和授权.请求通过XHR/Ajax完成.因此,如果用户未经过身份验证,Devise将向客户端发送401响应,而不是重定向到登录页面.但是用于设置CORS头的过滤器不用于该响应.因此401响应不会发送给客户端.我想在客户端捕获并使用401响应.
目前我使用的解决方法是不使用Devise身份验证方法,而是使用自定义身份验证代码段:
def authenticate_cors_user
if request.xhr? && !user_signed_in?
error = { :error => "You must be logged in." }
render params[:format].to_sym => error, :status => 401
end
end
Run Code Online (Sandbox Code Playgroud)
这也被设置为before_filterin ApplicationController.这样,设置CORS标头的过滤器就会被触发,一切正常.
我更喜欢使用Devise的默认行为,但必须在401响应中设置CORS头.这该怎么做?我必须为此配置监护人吗?
如何为Devise生成的401响应设置CORS头,而不是创建自己的响应?
Mar*_*dig 21
我成功地使用了rack-cors gem https://github.com/cyu/rack-cors,并在我的博客上概述了我的经验.
Punchline:指定中间件订单,因此cors处理程序在warden之前:
config.middleware.insert_before Warden::Manager, Rack::Cors
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6951 次 |
| 最近记录: |