问题标签 [rack-middleware]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby-on-rails - 资产在隔离的引擎端点中不起作用
尝试访问作为端点安装在中间件中的隔离引擎内的资产时,我遇到了 Not Found 错误。我正在尝试从引擎中访问资产,因此应该能够找到它们。
我怀疑资产路由不起作用,因为我将某个域上的请求路由到端点的方式:
我这样做是因为我不希望从主应用程序访问管理应用程序路由,反之亦然。它运作良好,只是不是资产。
ruby-on-rails - 如何使用 rails 中间件中的设计对用户进行身份验证?
配置/应用程序.rb
我正在使用 rack-reverse-proxy 将请求转发到在请求特定 url 时在不同主机中运行的另一台服务器(不是 rails 服务器)。现在我想使用设计验证用户是否已登录,然后仅将请求转发到代理服务器,否则将用户发送回登录页面。
ruby-on-rails-4 - Omniauth 自定义 `callback_path` 使 `env['omniauth.auth']` 返回 nil。尝试了一些方法在一定程度上取得了成果,但最终失败了
背景
我的应用程序要求我连接到两个不同的 Facebook 应用程序以用于不同的目的,我正在使用下面显示的代码。
问题
当使用如下所示的方法中的自定义回调路径时,在回调处理程序中,即在我的操作中返回为零。在intridea/omniauth repo中发现了一个类似的问题。facebook_opts_for_social_sharing
ExternalApiAuthController#create_social_sharing_auth_account
request.env['omniauth.auth']
/config/routes.rb
/app/controllers/external_api_auth_controller.rb
/config/initializers/omniauth.rb
使用该代码,正在发生的事情是在Request Phasecallback_path
期间正确获取。然而,一旦请求阶段完成并且OmniAuth::Strategies::OAuth2#request_phase
启动重定向,OmniAuth::Strategy实例仅
使用OmniAuth::Strategies::Facebook.default 选项。由于这些选项不包含(启动重定向之后),而评估以下行
总是返回 false,因此回调阶段永远没有机会执行。callback_path
on_callback_path?
return callback_call if on_callback_path?
方法一
为了解决这个限制,我尝试了一种发送OmniAuth::Strategies::Facebook.default 选项callback_path
的方法,
以便在每个阶段都可以接收到它。因此,我没有像在 method 中那样通过 SETUP_PROC 中的代码传递它,而是以以下方式传递它,即将它作为方法调用的选项传递:facebook_opts_for_social_sharing
OmniAuth::Builder#provider
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, setup: SETUP_PROC, callback_path: ExternalApiAuthUrl.sharing_auth_callback_path(provider: provider_facebook)
end
并使其工作更新 SETUP_PROC 看起来像
然而,这使得自定义 callback_path场景工作,但默认 callback_path /auth/facebook/callback
场景失败,因为包含自定义 callback_path 的选项在OmniAuth::Strategy实例callback_path
中始终可用。
方法二
因此,为了解决方法 1带来的限制,我尝试了另一种使用中间件的方法,该中间件基于请求的 path_info 和 params 调用带有所需选项的策略中间件。
/app/middleware/omniauth_builder_setup.rb
/config/application.rb
/config/initializers/omniauth.rb(注释掉use OmniAuth::Builder
)
使用这种中间件方法,回调阶段在两种情况下都会启动,即使用默认 callback_path/auth/facebook/callback
和自定义 callback_path时/auth/facebook/social_sharing/callback
。但在回调阶段但失败并出现以下错误:
我在OmniAuth::Strategy中添加了一些日志语句, 并生成了以下日志。
如果您在我的中间件的回调阶段注意到 @app 拥有一个 OmniAuth::Strategies::Facebook 的实例,但是一旦控件到达 OmniAuth::Strategy 中的 OmniAuth::Strategy @app 实例就引用了 class OmniAuth::Strategies::Facebook
。
我确信我的中间件有问题。我以前没有使用过中间件,所以不理解这个@app 概念。试图参考网络上的一些资源来掌握它,但没有成功。
任何人都可以帮我修复我的中间件,以便它能够以所需的方式工作吗?
如果可能,请尝试让我理解@app 的概念以及@app.call(env) 应该返回的状态、标题和正文值。例如,在我的情况下,我需要中间件只有在它与所需的omniauth 路径匹配时才能继续。如果不是,它应该跳过并继续前进而不会干扰。我不知道如何实现这种行为。
PS 从过去 2 天开始,我一直在努力解决这个限制,这里提供了所有细节、我的发现、我的方法,我希望社区中的某个人一定会站出来指导我解决我的问题。
谢谢。
ruby-on-rails - 带有中间件的 Rails I18n 路由
我需要翻译我的网站,为此我使用 I18n。使用语言环境作为 URL 参数,我想将用户重定向到他们的语言环境,该语言环境保存在他们的 cookie 中。
这是我用来重定向的 routes.rb 中的字符串:
我正在使用 Rack 中间件来获取 cookie 并在路由之前设置 I18n.locale:
问题出在 routes.rb 文件中:I18.locale 始终设置为默认语言环境,因此没有重定向到用户的语言环境,而是重定向到默认语言环境。
另外,我调试了中间件,正如我所见, I18n.locale 成功设置在那里。
任何想法如何在 routes.rb 中设置 I18n.locale?
ruby-on-rails - 在 Rails application.rb 中将多个参数传递给 Rack 中间件
我正在创建一个我想在我的 Rails 应用程序中使用的机架中间件。基本上,我需要将匹配特定 url 的请求记录到我的数据库中。为此,我需要将数据库配置传递给我的中间件,以便它可以与数据库建立连接。我正在尝试做:-
但这给出了一个错误
config/application.rb:40:in
<class:Application>': undefined method
read' for # (NoMethodError)
如果我添加 byebug 并在 byebug 控制台中运行它,它工作正常。我无法找出原因。我想做以下事情:-
- 在将数据库配置作为参数传递给我的中间件之前,我需要读取和修改数据库配置。
- 我想读取请求 url 的域。我们正在使用Apartment gem,我们的模式名称将是域名。
ruby-on-rails - 设备登录失败后,公寓 current_tenant 重置为“公共”
我使用 Devise 进行身份验证,使用 Apartment 来支持 SAAS 应用程序的多租户。
登录失败后,设计“重定向”到登录页面(Users::SessionsController#new),并且Apartment::Tenant.current
之前在TenantElevator
中间件中设置的值返回到其默认值“public”。
发生这种情况是因为 Devise 实际上并没有重定向到登录页面,而是使用新的机架环境调用 FailureApp(呈现登录页面)并返回其响应。新的机架应用程序没有TenantElevator
中间件,因此租户未在机架应用程序中设置。
有谁知道如何解决这个问题?也许我可以将 TenantElevator 中间件添加到 Failure 应用程序?
ruby-on-rails - 将中间件添加到设计失败应用程序
登录失败后,Devise 似乎在新的机架环境中调用失败的应用程序并返回它的响应,这通常是登录页面。
如何添加中间件来设计故障应用程序?
ruby-on-rails - 如何拯救 ActionDispatch::ParamsParser::ParseError 并在 rails 5 中返回自定义 API 错误?
每当向我的仅 API Rails 5.x 应用程序发送格式错误的 JSON 时,我都会收到异常,Rails 将整个堆栈跟踪作为 JSON 返回。显然,我想用一个很好的、自定义的、格式化的错误来回应。
以前我认为可以添加中间件并按如下方式处理异常:
但是,似乎中间件ActionDispatch::ParamsError
已从 Rails 5 中删除;
我还尝试了其他中间件(例如 ActionDispatch::ShowExceptions),以挽救不同的错误,但raise_bad_request
不知何故我的操作从未被调用。
我错过了什么,做错了什么,还是有另一种方法可以用 Rails 5 做到这一点?
谢谢!
ruby-on-rails - 忽略特定轨道路线中的 Rack::Timeout 中间
我已经安装了 rack-timeout gem 并在初始化程序中创建了 rack_timeout.rb。我在 rack_timeout.rb 中设置了 Rack::Timeout.service_timeout = 1。我想限制 rack-timeout 以在其他控制器超时时停止执行比 api 中的控制器。只有 api 控制器的执行应该停止。我在 lib 中创建了一个名为 my_middleware.rb 的自定义中间件
配置/开发.rb
但它不起作用。发生超时时,任何地方的机架超时都会引发异常。
ruby-on-rails - 是否可以在不使用 Gemfile 的情况下包含未构建的 Rails 引擎?
这可能是一个人为的问题,但我正在研究 Rails API 并希望保持 API 中间件堆栈最小,同时提供需要一些更复杂中间件的 OAuth 端点。我的想法是把它做成一个引擎,并将该引擎包含在应用程序中。
但是,我认为创建 Rails 引擎会比生成新引擎 gem 并将 gem 包含在我的 Gemfile 中更简单。有没有办法只是......require 'lib/engines/my_engine'
从application.rb
或什么?我不应该只需要一个 gemspec 来包含一个未构建的引擎 - 我可以将所有依赖项放在主应用程序的 Gemfile 中。
我真正想做的就是为一小组路由获取一个单独的中间件堆栈!