3

Rails バックエンドで iPhone クライアントを構築しています。クライアントは、Oauth2 API を介してサーバーと通信します。これは、oauth2 と doorkeeper gem を使用して設定しました。

すべての API リクエストは、トークンとともに送信する必要があります。現在、2 つのトークン「タイプ」をサポートしています。

  • クライアント: クライアント資格情報許可タイプを使用します。これは、アプリ全体のアセットやキーなどへのアクセスなど、ユーザー固有ではないリクエスト用です。
  • ユーザー: パスワード認証資格付与タイプを使用します。このトークンを取得するには、クライアントは有効なユーザー名とパスワードの組み合わせを渡して要求する必要があります。すべてのユーザー要求は、このトークンを使用します。

これはすべて正常に機能していますが、ユーザーが Facebook を使用してアプリにログインすることも許可しているため、問題が発生しています。

ユーザーが FB にログインすると、クライアントは Facebook UID をサーバーに渡すことで応答します (クライアント トークンを使用)。次に、サーバーでいくつかのチェックを行い、この UID をデータベース内の既存のユーザーと照合します。

問題は次のとおりです。ユーザー トークンを使用してこのリクエストに応答したいと考えています。ユーザーがアプリにログインするため、このトークンが必要であり、その後のすべてのリクエストでこのトークンが必要になります。ただし、現在、これを行う唯一の方法は次のとおりです。

ユーザー名とパスワードで応答します。次に、パスワード資格情報フローに従って、クライアントにユーザー トークンの要求を行わせます。パスワードを渡しているので、これは好きではありません。また、複数回の旅行が必要です。

基本的な何かが欠けているような気がします。このフローを処理する別の方法はありますか?

4

2 に答える 2

1

私は解決策を持っていると思いますが、それは間違いなくハックです。

基本的に、この Facebook シナリオも処理するために、パスワード資格情報フローをハイジャックしています。

クライアントは次のように呼び出しを行います (Ruby でテストしたため、フォーマットがオフになっている可能性があります)。

curl -i http://www.example.com/oauth/token   -F grant_type=password   -F client_id=(client id)-F client_secret=(client secret) -F username=(email address) -F password=(password) -F provider="facebook" -F uid=(fb uid) -F token=(fb token)

私のサーバーでは、「プロバイダー」パラメーターを確認します。見つかった場合は、パスワード認証の代わりに facebook の uid を使用して、ユーザー テーブルで一致するものを見つけます。また、セキュリティ対策として FB トークンを渡します (一致を探す前に、このトークンが uid に属していることを確認します)。一致が見つかった場合、ユーザーはトークンのリソース所有者として設定されます。つまり、ユーザー トークンを取得することになります。

これは、私の doorkeeper.rb のコード ブロックです。

resource_owner_from_credentials do |routes|
 if params[:provider]
    // FB uid authentication path code here
 else
   // password authentication
   user = User.find_by_email(params[:username])
   user if user && user.authenticate(params[:password])
 end
end
于 2012-12-06T01:38:03.743 に答える