6

私たちの Rails 3 アプリは facebook-omniauth を使用して、ユーザーが facebook で認証できるようにします。

できるだけ多くのWebベースの認証システムを使用するといいので、このSOの質問に対する回答(反対票が投じられていないもの)に従ってみましたが、うまくいきません。

答えの要点は次のとおりです。

omn​​iauth-facebook は、access_token パラメータを使用してコールバック エンドポイントへのリクエストを問題なく処理します。簡単 :)

これをテストするために、ブラウザで次のリクエストを発行しています。

/users/auth/facebook_api/callback?access_token=BAAB...

しかし、サーバーログには次のように表示されます。

(facebook) Callback phase initiated.
(facebook) Authentication failure! invalid_credentials: OAuth2::Error, : 
{"error":{"message":"Missing authorization code","type":"OAuthException","code":1}}

何が間違っているのかわかりません。何かを台無しにすることをテストするためにブラウザを介してこれを実行しようとしているという事実はありますか? iOS アプリで www ベースの認証ロジックを再利用する方法について、他に何かアイデアはありますか?

更新:よくわかりませんが、www 用とモバイル用に 1 つずつ、複数の facebook omniauth 戦略を持つために、このガイドに 従っています。

4

1 に答える 1

7

私が最初に求めていたものと一致する解決策は見つかりませんでしたが、解決方法は次のとおりです。iPhoneで取得したアクセストークンをサーバーに送信し、手動でログインを実行します.

def facebook_login
  graph = Koala::Facebook::API.new(params[:user][:fb_access_token])
  profile = graph.get_object('me')
  omniauth = build_omniauth_hash(profile)

  @user = User.find_or_create_for_facebook_oauth(omniauth)
end

www には既に というメソッドがfind_or_create_for_facebook_oauthあり、それは Omniauth から結果を取得し、ユーザーを見つけるか、新しいユーザーを作成しました。そのメソッドをモバイルで利用するには、引数として渡すことができるように、同様の構造を手作業で作成する必要がありました。

def build_omniauth_hash(profile)
  struct = OpenStruct.new
  struct.uid = profile['id']
  struct.info = OpenStruct.new
  struct.info.email = profile['email']
  struct.info.image = "http://graph.facebook.com/#{profile['id']}/picture?type=square"
  struct.info.first_name = profile['first_name']
  struct.info.last_name = profile['last_name']
  struct.info.bio = profile['bio']
  struct.info.hometown = profile['hometown']['name'] if profile['hometown']
  struct.info.location = profile['location']['name'] if profile['location']
  struct
end
于 2013-01-16T00:00:26.600 に答える