2017-02-01 5 views
1

ここに状況があります。私はLinkedIn OmniAuth戦略を実装する必要があるアパートの宝石を使ってマルチテナントレールアプリを持っています。Multi-tenant Rails 5 Appを使用したDevise 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のは、自分のコールバックでワイルドカードをサポートしていないということですU RLsので、OAuth認証後にユーザーを適切なドメインに誘導する方法が失われています。

+0

ユーザーを特定のユーザーページにリダイレクトするコントローラアクションを追加する必要があります。私はLinkedIn APIが何らかの 'user_id'を返すと思いますか?ここから始める必要があります。 – CottonEyeJoe

+0

残念ながら、不可能かもしれないスキーマが原因です。スキーマ「A」と「B」を持っていれば、それぞれが 'user.id == 1'を持つユーザを持つことができます。 – Will

答えて

1

だから、答えは結局request.env["omniauth.params"]

throughtコールバックアクションの許可リンク形式に渡さになるだろう、許可リンクにパラメータを渡すことでしたが判明:

ここで私はトラブルの追加を持っていましたパラメータをDevise 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 and Linkedin

私は私のコールバック・コントローラをセットアップするには、このチュートリアルを使用していました。私の主な目的は、コールバックコントローラをブランクのサブドメインに置くことでしたので、LinkedIn Dev AppにコールバックURLを1つだけ与えなければなりませんでした。このコントローラーでは、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 
0

あなたはリンクがあるコールバックとして登録することができますか(私はあなたが管理不能になってしまった場合は速くなります)。 。

+0

残念ながら、サブドメインは動的に生成されます。しかし、クッキーのアイデアは面白いです、それは役に立つかもしれません。 – Will

関連する問題