1

アプリケーション用の API を作成しています。一方には API サーバー (およびメイン アプリ) があり、もう一方にはクライアントがあります。サーバーはDoorKeeperを使用してOAuth 2.0を使用してAPIを保護し(基本的にメインアプリをOAuth 2.0プロバイダーに変えます)、クライアントはアプリのカスタム戦略でOmniAuthを使用しています.

メイン アプリは、サブドメインを使用してマルチテナンシーを使用します。そのため、すべてのクライアントが独自のサブドメインを持っています。oauthDoorKeeper インターフェースにルーティングされるサブドメインもあります。

ユーザーが [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 ハッシュには渡したクライアントのアカウント名 (クライアント パラメータ) が含まれていないため、この情報 (クライアントのアカウント名) はありません。

4

2 に答える 2

3

問題を解決する方法を見つけました。OmniAuth のソース コードをさらに掘り下げる必要がありました。request_phase私がしなければならなかったことは、次のようにカスタム戦略のメソッドをオーバーライドすることです:

def request_phase
  redirect client.auth_code.authorize_url({:redirect_uri => callback_url, :catapult_client => request.params["client"]}.merge(authorize_params))
end

どこ:catapult_clientに、渡したい追加のパラメーターを追加すると、うまくいきます!

于 2013-03-01T11:41:24.843 に答える
1

最も簡単な方法は、ログイン ページにリダイレクトされるときに、place-to-redirect-to-after-authenticating-successfully をクエリ パラメータとして渡すことです。これにより、GET リクエストのクエリ文字列の一部として存在します。それを保存し、認証が成功したら、そこにリダイレクトします。このデータを OAuth プロセスに含める必要はまったくありません。

もちろん、それらもすべてサブドメインから始まると想定しています。


編集:

ユーザーが [Log in with my app] リンクをクリックすると、oauth サブドメインにリダイレクトされます。

  • ユーザーが から開始すると仮定するとmysubdomain.yourapp.com、ユーザーは[Log in with my app] リンクをクリックします。

  • リンクには、サブドメインを含むクエリパラメーターも含まれているため、oauth.yourapp.com?redirect=mysubdomain.yourapp.com(または単にoauth.yourapp.com?redirect=mysubdomain)

  • ユーザーが oauth.yourapp.com にアクセスします。アプリはクエリ パラメーターを保存します。ユーザーは詳細を入力するか、サービスにリダイレクトされます…</p>

  • OAuth プロセスが終了し、ユーザーが認証されました。

  • redirectユーザーを以前に保存したパラメーターにリダイレクトします。

これは私が行う方法です。Rails ではありませんが、このプロセスをどのフレームワークでも使用できない理由がわかりません。これは、前述したように、ユーザーが正しいサブドメインで開始するかどうかによって異なります。

于 2013-03-01T09:57:06.893 に答える