gpt4 book ai didi

ruby-on-rails - 使用 Multi-Tenancy Rails 5 应用程序设计 OmniAuth

转载 作者:行者123 更新时间:2023-12-02 20:51:50 24 4
gpt4 key购买 nike

情况是这样的。我有一个使用 apartment gem 的 Multi-Tenancy Rails 应用程序,我需要在其中实现 LinkedIn OmniAuth 策略。

正如您在我的路由中看到的那样,Devise 用户和关联的路由仅保留在子域的各个模式中。

示例路线:

好:https://frank.example.io/users/sign_in

错误:https://example.io/users/sign_in

路线

class SubdomainPresent
def self.matches?(request)
request.subdomain.present?
end
end

class SubdomainBlank
def self.matches?(request)
request.subdomain.blank?
end
end

Rails.application.routes.draw do
constraints(SubdomainPresent) do

...

devise_for :users, controllers: {
omniauth_callbacks: 'omniauth_callbacks'
}
devise_scope :user do
get '/users/:id', to: 'users/registrations#show', as: "show_user"
end

...

end
end

我的具体问题是 LinkedIn 不支持带有回调 URL 的通配符,因此我不知道如何在 OAuth 身份验证后将用户定向到正确的域。

最佳答案

所以事实证明答案是在授权链接中传递参数,这些参数最终会通过 request.env["omniauth.params"]

传递给回调操作

授权链接格式:

在这里,我在将参数添加到 Devise URL 构建器时遇到了问题,所以我只是手动添加了参数。这可能会被移动到一个 url helper

<%= link_to "Connect your Linkedin", "#{omniauth_authorize_path(:user, :linkedin)}?subdomain=#{request.subdomain}" %>

路线:

然后我定义了一个由指向回调操作的空白子域约束的​​路由。

class SubdomainPresent
def self.matches?(request)
request.subdomain.present?
end
end

class SubdomainBlank
def self.matches?(request)
request.subdomain.blank?
end
end

Rails.application.routes.draw do
constraints(SubdomainPresent) do
...
devise_for :users, controllers: {
omniauth_callbacks: 'omniauth_callbacks'
}
resources :users
...
end

constraints(SubdomainBlank) do
root 'welcome#index'
...
devise_scope :user do
get 'linkedin/auth/callback', to: 'omniauth_callbacks#linkedin'
end
...
end
end

Controller :

我使用本教程设置回调 Controller :Rails 4 OmniAuth using Devise with Twitter, Facebook and Linkedin .我使用回调 Controller 的主要目标是让它驻留在空白子域中,这样我只需要为我的 LinkedIn Dev App 提供一个回调 URL。使用此 Controller ,我在 omniauth 参数中搜索子域参数,并使用它切换到正确的架构。

def self.provides_callback_for(provider)
class_eval %Q{
def #{provider}
raise ArgumentError, "you need a subdomain parameter with this route" if request.env["omniauth.params"].empty?

subdomain = request.env["omniauth.params"]["subdomain"]
Apartment::Tenant.switch!(subdomain)
...
end
}
end

关于ruby-on-rails - 使用 Multi-Tenancy Rails 5 应用程序设计 OmniAuth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41971165/

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