アプリケーション用の API を作成しています。一方には API サーバー (およびメイン アプリ) があり、もう一方にはクライアントがあります。サーバーはDoorKeeperを使用してOAuth 2.0を使用してAPIを保護し(基本的にメインアプリをOAuth 2.0プロバイダーに変えます)、クライアントはアプリのカスタム戦略でOmniAuthを使用しています.
メイン アプリは、サブドメインを使用してマルチテナンシーを使用します。そのため、すべてのクライアントが独自のサブドメインを持っています。oauth
DoorKeeper インターフェースにルーティングされるサブドメインもあります。
ユーザーが [Log in with my app] リンクをクリックすると、oauth サブドメインにリダイレクトされます。メイン アプリにログインしていない場合は、正しいサブドメインのログイン ページにリダイレクトする必要があります。そのため、DoorKeeper がリダイレクト先のサブドメインを認識できるように、クライアントのアカウント名をサーバーに渡す必要があります。
どうすればそれを達成できますか?
私はこの件について調査し、コールバック アクションに渡される OmniAuth パラメータに渡す方法を見つけました。これらのパラメータはサーバーで利用できますか?
編集:私はDeviseを使用していません!
EDIT 2:ここにいくつかのコードがあります。
クライアント アプリのセッション コントローラーの作成アクション (アプリでログイン)def set_client
self.current_client = Client.find(params[:client][:name])
redirect_to "/auth/catapult?client=#{self.current_client.account_name}"
end
ご覧のとおり、クライアント パラメータを OmniAuth ルートに追加しますが、このパラメータはサーバー アプリ (DoorKeeper) に渡されないため、サーバー アプリのどこにリダイレクトすればよいかわかりません。
ドアキーパーの設定resource_owner_authenticator do
p params
User.find_by_id(session[:user_id]) || redirect_to(log_in_path)
end
上記のリダイレクトでは、クライアントのアカウント名をサブドメインとして指定する必要がありますが、params ハッシュには渡したクライアントのアカウント名 (クライアント パラメータ) が含まれていないため、この情報 (クライアントのアカウント名) はありません。