gpt4 book ai didi

ruby-on-rails - 设计/OmniAuth 覆盖默认回调 url

转载 作者:行者123 更新时间:2023-11-30 05:20:36 25 4
gpt4 key购买 nike

我在 Rails 4 应用程序中使用 Devise 3.5 和 Omniauth。我已经创建了与 Facebook 的集成,允许用户将他们的 Facebook 帐户连接到我的应用程序。目前,当用户点击连接按钮时,他们被发送到 /user/auth/facebook,然后重定向到 Omniauth 生成的回调 url:/user/auth/facebook/callback。我想做的是在某些情况下手动覆盖此回调 url - 这意味着我不想在初始化程序中覆盖它 - 使用 完全限定的 url。例如,如果用户开始使用 http://www.example.com/ 我可能想用 http://app.example.com/user 覆盖默认回调 url/auth/facebook/回调

我的应用程序有动态子域,用户将(几乎)总是在子域上开始身份验证过程。不幸的是,Facebook 似乎不支持 oauth 重定向 url 中的通配符,这就是为什么我希望能够检测用户是否在子域上并将回调 url 调整为我在 Facebook 应用程序中列入白名单的内容,以便授权过程成功。

据我所知,url 助手 omniauth_authorize_path 接受要作为参数传递的附加参数。我试过像这样传递自定义回调路径,但没有成功:

user_omniauth_authorize_path(:facebook, callback_path: @custom_callback)

我也尝试过将 callback_path 更改为 redirect_urlredirect_uri,但似乎没有任何效果。当我查看生成的链接时,它确实将回调作为参数包含在 url 中,但是当我单击该链接时,我被重定向回默认回调 url 而不是自定义回调 url。

最佳答案

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

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> . Devise 从这里将他们定向到 Facebook,然后将他们重定向回 https://auth.example.com/ .

然后在OmniauthCallbacksController#facebook我可以像这样从 omniauth 参数中提取用户的 ID:

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

从这里我可以将凭据保存到数据库并将用户重定向回适当的子域。该解决方案避免了 CSRF token 的问题,更重要的是不需要我使用 Ruby/ERB 来构建用户单击连接按钮时发送到的 omniauth 授权路径。

关于ruby-on-rails - 设计/OmniAuth 覆盖默认回调 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35920806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com