我有一个可以从 2 个域访问的 rails 应用程序。Facebook 要求我为每个域注册一个 facebook 应用程序,并为每个域提供凭据。使用 Omniauth,我只能指定一组在应用程序启动时设置的凭据。但是,我需要根据请求的主机为 FB 提供不同的凭据。
这里有2个问题:
- 如何在运行时更改 facebook 的 Omniauth 凭据?
- 如何拦截对 facebook 的调用、检查域并相应地设置凭据?由于 Omniauth 使用机架中间件,前置过滤器将不起作用。
任何建议都非常感谢!
我有一个可以从 2 个域访问的 rails 应用程序。Facebook 要求我为每个域注册一个 facebook 应用程序,并为每个域提供凭据。使用 Omniauth,我只能指定一组在应用程序启动时设置的凭据。但是,我需要根据请求的主机为 FB 提供不同的凭据。
这里有2个问题:
任何建议都非常感谢!
复制评论中的答案,以便从“未回答”过滤器中删除此问题:
我现在自己解决了这个问题。问题是 fb 策略第二次回调 fb 以获取访问令牌。在第二次调用中,使用了错误的凭据(在初始化程序中设置的凭据)。所以我不得不修补 OAuth2 策略,以便它再次调用 rails 应用程序,为第二次调用设置运行时凭据。在通常只处理响应表单 Omniauth 的回调中,我设置凭据并返回 404,除非 request.env["omniauth.auth"] 存在。这很好用,但对于没有动态提供程序的应用程序有一些副作用。
现在的问题是,即使应用程序不想在运行时设置凭据,它也必须向回调添加一个条件,例如 if request.env["omniauth.auth"] 以避免回调代码在它被称为第一次。解决方案可能是向 Omniauth 构建器添加一个参数,例如 :dynamic_provider,并且仅在设置时调用应用程序。
~ 每个Nico的回答
这个问题相当古老,但仍然相关。现在还可以在 OmniAuth 的设置阶段动态设置提供者详细信息。
例如:
Rails.application.config.middleware.use do
provider :example,
setup: ->(env) do
env['omniauth.strategy'].options[:foo] = env['rack.session']['foo']
env['omniauth.strategy'].options[:client_options][:site] = Something.dynamic('param')
end
end
来源:https ://github.com/omniauth/omniauth/wiki/Dynamic-Providers