Разработайте OmniAuth с многопользовательским приложением Rails 5

Вот ситуация. У меня есть многопользовательское приложение 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.


person Will    schedule 01.02.2017    source источник
comment
Вам нужно будет добавить действие контроллера, в котором вы перенаправляете пользователя на его конкретную пользовательскую страницу. Я предполагаю, что API LinkedIn возвращает какой-то user_id обратно? Вот с чего вам нужно начать.   -  person CottonEyeJoe    schedule 01.02.2017
comment
К сожалению, из-за схем это может быть невозможно. Если бы у меня были схемы A и B, в каждой из них мог бы быть пользователь с user.id == 1.   -  person Will    schedule 01.02.2017


Ответы (2)


Таким образом, получается, что ответ заключался в том, чтобы передать параметры в ссылке авторизации, которые в конечном итоге будут переданы в действие обратного вызова через request.env["omniauth.params"]

Формат авторизационной ссылки:

Здесь у меня возникли проблемы с добавлением параметров в конструктор URL-адресов Devise, поэтому я просто добавил параметры вручную. Это, вероятно, можно переместить в помощник 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 с использованием Devise с Twitter, Facebook и Linkedin. Моя основная цель с контроллером обратного вызова заключалась в том, чтобы он находился в пустом поддомене, поэтому мне нужно было указать только один URL-адрес обратного вызова для моего приложения LinkedIn Dev. С помощью этого контроллера я ищу параметры 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
person Will    schedule 15.02.2017

не могли бы вы зарегистрировать каждый домен в качестве обратного вызова со ссылкой (я думаю, если у вас много, что быстро становится неуправляемым).. Вы можете использовать файл cookie перед отправкой их в linkedin, чтобы, когда они возвращаются, вы знали, к какому поддомену они принадлежат.

person Gary Pinkham    schedule 01.02.2017
comment
К сожалению, поддомены генерируются динамически. Однако идея с cookie интересна, это может быть полезно. - person Will; 04.02.2017