2

这是情况。我有一个使用公寓 gem 的多租户 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 身份验证后将用户引导到正确的域。

4

2 回答 2

4

所以事实证明,答案是在授权链接中传递参数,最终将通过t传递给回调操作request.env["omniauth.params"]

授权链接格式:

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

<%= 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

控制器:

我使用本教程来设置我的回调控制器:Rails 4 OmniAuth using Devise with Twitter、Facebook 和 Linkedin。我使用回调控制器的主要目标是让它驻留在空白子域中,因此我只需向我的 LinkedIn 开发应用程序提供一个回调 URL。使用这个控制器,我在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
于 2017-02-15T15:20:33.533 回答
1

您可以将每个域注册为带有链接的回调吗(我想如果您有很多东西很快变得无法管理)..您可以在将用户发送到linkedin之前对用户进行cookie,这样当他们返回时,您就知道他们属于哪个子域。

于 2017-02-01T19:35:48.367 回答