当前位置: 首页 > 知识库问答 >
问题:

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

孔波
2023-03-14

我正在开发一个应用程序,其中服务器和使用api的客户端位于不同的域下,所以我想使用CORS。为此,我必须在服务器响应中设置相应的超文本传输协议标头:

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

此方法用作应用程序控制器中的前置过滤器

对于某些资源,用户必须经过身份验证和授权。请求通过XHR/Ajax完成。因此,如果用户未通过身份验证,Desive将向客户端发送401响应,而不是重定向到登录页面。但是设置CORS头的过滤器不用于该响应。因此,401响应不会发送到客户端。我想在客户端捕获并使用401响应。

目前,我正在使用一种变通方法,即不使用Deave身份验证方法,而是使用一个自定义的身份验证代码片段:

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

这也被设置为应用程序控制器中的前过滤器。这样就触发了设置CORS头的过滤器,一切正常。

我更愿意使用designe的默认行为,但必须在401响应中设置CORS头。怎么做?我需要配置典狱长吗?

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

共有2个答案

周峻
2023-03-14

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

使用HAProxy,您可以设置所有访问网站的请求。com/api/将被内部重定向到rails机器。

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
云联
2023-03-14

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

要点:指定中间件顺序,以便cors处理程序在典狱长之前:

config.middleware.insert_before Warden::Manager, Rack::Cors
 类似资料:
  • 我已经实现了一个使用基本身份验证(使用Spring Security性)的web服务器。 我在访问URL时禁用了默认身份验证入口点(它只返回401,而不是用www身份验证标头响应401),目的是防止浏览器显示身份验证弹出窗口。 我能够用javascript代码和命令行工具(如curl)连接到服务器,但是当我用浏览器(chrome)测试它时 <代码>curl-v-u用户:密码本地主机:8080/用户

  • 如何通过Axios.js发送带有令牌的身份验证头?我试过几件事都没有成功,比如: 给出以下错误:

  • 我想使用服务帐户实现谷歌表API请求。我创建了这个代码: 但是我得到了这个错误: com.google.api.client.auth.oauth2.TokenResponseException: 401 未经授权 在这个方法中 你知道我该如何解决这个问题吗?

  • 我在这里遵循 JWT 夸克指南。我想在不允许用户组访问 API 时发送自定义响应。 这是指南中显示的示例。 我如何知道请求是否未经授权,以便我可以发送自定义响应。

  • 我的代码:GoogleCredential凭据 credential.refreshToken() 错误日志: 创建服务号的步骤: 我在凭据中的oauth 2.0中创建了一个Web应用程序 然后我用客户端ID创建了一个服务号 现在我正在使用这个服务号和从它生成的p12证书来验证和创建Google凭据的对象 一旦刷新令牌,我就给了我401例外。 在这种情况下,任何帮助都会受到感激

  • 我想使用爪哇谷歌驱动器API。我尝试了这段代码: 但是我得到了这个错误: 我使用以下配置: 你能告诉我怎么解决这个问题吗?