Ruby on rails 如何为通过OmniAuth的所有请求设置自定义标头?

Ruby on rails 如何为通过OmniAuth的所有请求设置自定义标头?,ruby-on-rails,omniauth,omniauth-oauth2,Ruby On Rails,Omniauth,Omniauth Oauth2,这主要是一个思考练习,我不知道如何解决。:) 有人知道如何为使用omniauth或omniauth-oauth2gems的所有请求设置自定义请求头吗 我已经尝试过下面的方法,但是我没有在Chrome的开发者工具中看到标题 OmniAuth.config.before_request_phase do |env| env['MY_CUSTOM_HEADER'] = 'true' end 我做错了什么?我错过了什么 根据回复进行编辑: 为什么我需要自定义标题集在这里并不重要——正如我在问题的

这主要是一个思考练习,我不知道如何解决。:)

有人知道如何为使用
omniauth
omniauth-oauth2
gems的所有请求设置自定义请求头吗

我已经尝试过下面的方法,但是我没有在Chrome的开发者工具中看到标题

OmniAuth.config.before_request_phase do |env|
  env['MY_CUSTOM_HEADER'] = 'true'
end
我做错了什么?我错过了什么


根据回复进行编辑:

为什么我需要自定义标题集在这里并不重要——正如我在问题的顶部提到的:这只是我的好奇心。限制条件是我想在任何操作系统或浏览器上测试自定义标题,因此在这里仅使用Chrome中的开发人员工具是不够的,因为并非所有浏览器在所有操作系统上都具有该功能


我要做的是为所有从gem发出的OAuth请求添加一个自定义头。就是这样。

在浏览器开发工具中,您只能看到由浏览器发送的请求头或由浏览器接收的响应头。负载平衡器、反向代理、中间件等设置的任何请求头都只对请求处理链的下一阶段可见

OmniAuth存在于中间件中,所以从技术上讲,应用程序中的任何请求都会使用它,除非其他中间件终止请求链并提供一些响应。 omniauth术语中的“请求”也不是http请求,它是一个身份验证阶段,通常发生在
/auth/:provider
(还有“选项”和“回调”阶段)

不清楚为什么需要在中间件中为进入您自己的应用程序的请求设置请求头-当请求将由omniauth处理时,它不会击中您的控制器,除了
回调
阶段,该阶段将设置
request.env['omniauth.auth']

由于您提到了开发人员工具-可能您希望在请求阶段使用响应头,要设置这些响应头,您需要在策略中覆盖从
request\u阶段返回的机架响应。但是对于oauth2,只有一个重定向(仍然可以设置头,但意义更小)

因此,首先,您需要准确地确定要在哪个请求/响应上设置哪些头,其中有几个。简化顺序:

OAuth请求处理程序不能强制浏览器(或任何类似的用户代理)披露比HTTP协议中指定的更多的信息。为此感到高兴:任何其他姿态都可能导致信息泄露

Omniauth可能建立的唯一连接是将代码交换为访问/刷新令牌。这是特定于所讨论的策略的,但是策略有机会在其内部客户机中包含任意头。如果您正在编写一个在访问令牌交换期间需要基本身份验证头的自定义策略,它可能如下所示:

需要'omniauth-oauth2'
模块OmniAuth
模块策略
类DemoStrategy特殊授权头
})
超级的
结束
def basic_auth_标题
“Basic”+Base64.strict_encode64(“#{options[:demo_id]}:#{options[:demo_secret]}”)
结束
结束
结束
结束
这里,
build\u access\u token
覆盖了内部HTTP客户机的超类标准构造函数,并在将其交回堆栈之前注入额外的头。在内部,它被传递给
oauth2
gem,后者反过来使用法拉第,因此法拉第接受的任何东西都可能是有效的选项

如果需要将其他信息传送到身份验证服务器,则该策略可能会将其编码到重定向URL中。例如,omniauth-google-oauth2策略可配置为在登录到google认证端点的URL中携带认证范围和电子邮件提示

将XSRF状态参数与加密的会话cookie结合使用也很常见,以防止身份欺骗。根据身份验证服务器的合作,部分或全部数据可能会反映在重定向回处理程序中

在最简单的情况下,这是由strategy子类中的
authorize\u params
方法处理的,例如

def authorize_参数
super.tap do| params|
params[:something]=“我的额外值”
结束
结束
然而,在实践中,设置扩展参数所涉及的代码量可能相当大。对于使用Omniauth执行此操作的示例,我建议您查看一下,然后再次提请您注意
authorize\u params
方法,它是这项繁重工作的入口点


在整个流程中,这些都是服务器端代码实际影响事务的接触点。基本上,用户的客户端/浏览器只执行正常的HTTPS请求即可参与其中。

感谢您的回复!为了回答你关于我为什么要这么做的问题——这只是一个思想实验……你是否会想知道我有一天无法解决的问题:我想在“获取授权/提供程序”阶段添加一个自定义标题。至于你的建议,我在概念上理解如何去做,但它仍然不是