如果用户未经授权,如何使用 Devise 发送 CORS 标头(401 响应)



我正在开发一个应用程序,其中服务器和 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

此方法用作ApplicationController中的before_filter

对于某些资源,用户必须经过身份验证和授权。请求通过 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

这也被设定为ApplicationController中的before_filter。这样,设置CORS标头的过滤器就会被触发,一切正常。

我更喜欢使用 Devise 的默认行为,但必须在 401 响应中设置 CORS 标头。怎么做?我必须为此配置典狱长吗?

如何为 Devise 生成的 401 响应设置 CORS 标头,而不是创建我自己的响应?

我成功地使用了rack-cors gem https://github.com/cyu/rack-cors,并在我的博客上概述了我的经验。

妙语:指定中间件顺序,以便 cors 处理程序在 warden 之前:

config.middleware.insert_before Warden::Manager, Rack::Cors

我们通常不喜欢 CORS 标头。我们更喜欢使用 HAProxy 来重定向。

使用 HAProxy,您可以将所有进入 website.com/api/的请求设置为在内部重定向到您的导轨机器。

frontend main *:80
  acl api      path_beg  -i /api
  acl app      path_beg  -i /app
backend app_backend
  reqrep    ^([^ ]*) /app/(.*)  1 /2
  balance   roundrobin
  server    app_files smartphoneapp.localhost:8000
backend api_backend
  reqrep    ^([^ ]*) /api/(.*)  1 /2
  balance   roundrobin
  server    app_api localhost:3000

相关内容

  • 没有找到相关文章

最新更新