设计/ OmniAuth覆盖默认回调URL

问题描述 投票:7回答:2

我在Rails 4应用程序中使用设计3.5 Omniauth。我创建与Facebook集成,允许用户到他们的Facebook账户连接到我的应用程序。目前,当用户点击连接按钮,还要送到/user/auth/facebook,然后重定向到Omniauth产生回调网址:/user/auth/facebook/callback。我想要做的是手动覆盖在某些情况下,这种回调URL - 这意味着我不想覆盖它在初始化 - 一个完全合格的URL。例如,如果用户在http://www.example.com/开始时我可能要重写与http://app.example.com/user/auth/facebook/callback默认的回调URL。

我的应用程序具有动态子域和用户(几乎)总是开始于一个子域的认证过程。不幸的是,似乎Facebook的不支持OAuth的通配符重定向的URL,这就是为什么我想要的检测能力,如果用户是在一个子域和调整回调URL的东西,我已经在我的Facebook应用程序白名单,这样的授权过程成功。

从我读过,omniauth_authorize_path接受额外的参数的URL帮手转嫁作为参数。我试图通过一个定制的回调路径像这​​样,但没有成功:

user_omniauth_authorize_path(:facebook, callback_path: @custom_callback)

我也试着改变callback_pathredirect_urlredirect_uri,但似乎没有任何工作。当我看到系统产生的链接,它确实有回调作为URL参数,但是当我点击链接,我重定向回默认的回调URL,而不是自定义回调URL。

ruby-on-rails facebook devise omniauth omniauth-facebook
2个回答
1
投票

你有试过REDIRECT_URI?

user_omniauth_authorize_path(:facebook, redirect_uri: @custom_callback)

编辑:对不起,我错过了你的文章的第二部分。

其实,我在生产同样的问题,但它完美上登台环境。唯一的区别是关于分期回调URL其中有一个更加子域* .staging.domain.com

顺便说一句,你可以提供的色器件初始化文件的静态callback_url:

config.oaumniauth :facebook, ..., callback_url: 'url right here'

我对这个问题这个昨天。要么我提供了一个静态的回调URL但Facebook提出了我一个CRSF错误:

omniauth: (facebook) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected

还是我让设计动态设置callback_url这会看起来像

https://*.domain.com/DEVISE_MODELS/auth/facebook

在这种情况下,我得到一个直非匹配/白名单回调过程FG洛期间的URL。

Aaditi:

好!我做到了。我能够取得OAuth登录与通配符子域。

  1. 在你的色器件初始化提供静态callback_url
  2. 域名添加到您的会话存储为:域:“.domain.com”

与我越来越没有CRSF错误,也不nunmatching CB网址/白名单。

希望它会为你工作!


0
投票

以下是我解决了这个问题。我敢肯定还有其他的方法,但是这似乎是最简单最优雅的解决方案,我能想出。

config/routes.rb我建立了一个auth子域。我所有的Oauth连接请求将开始不同的子域,然后Facebook正在建立这些用户转发回auth.example.com子域。

constraints AuthRedirect do
    devise_scope :contact do
        get '/auth/facebook/callback' => 'omniauth_callbacks#facebook'
        post '/auth/facebook/callback' => 'omniauth_callbacks#facebook'
    end
end

这里是/lib/auth_redirect.rb。这只是检查,如果子域是auth和捕获流量。这是摆在我的路由列表的顶部,以便优先于其他子域。

class AuthRedirect
    def self.matches?(request)
        request.subdomain.present? && request.subdomain == 'auth'
    end
end

然后在我的客户端,当用户点击该按钮Connect with Facebook,我送他们到/auth/facebook?contact_id=<id>。从这里制定引导他们在Facebook,然后重定向他们回到https://auth.example.com/

然后,在OmniauthCallbacksController#facebook我可以从omniauth PARAMS像这样拉用户的ID:

auth = env["omniauth.auth"]
contact = Contact.find(env['omniauth.params']['contact_id'])

在这里,我能坚持凭证到数据库,并重定向用户返回到适当的子域。该解决方案避免了问题CSRF令牌,并且更重要的是不需要我使用Ruby / ERB打造omniauth授权路径用户发送到当他们点击连接按钮。

© www.soinside.com 2019 - 2024. All rights reserved.