1

ユーザーの作成と認証に Omniauth-Facebook を使用しています。最初の 2 人のユーザーには機能しますが、3 番目のユーザーには失敗します。まだ認証できます。失敗するのは CREATE プロセスです。これは、解決策のない一般的な問題のようです。

エラーログ:

 facebook) Callback phase initiated.
(facebook) Authentication failure! invalid_credentials: OAuth2::Error, : 
{"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}}

onmiauth.rb:

 Rails.application.config.middleware.use OmniAuth::Builder do
  provider :developer unless Rails.env.production?
  provider :facebook, 'xxxxxxx', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
           :scope => 'email,user_birthday,user_hometown,user_location', :display => 'popup'
end

セッションコントローラー:

class SessionsController < ApplicationController
  def create
      auth = request.env["omniauth.auth"]
      player = Player.find_by_provider_and_uid(auth["provider"], auth["uid"]) || Player.create_with_omniauth(auth)
      session[:player_id] = player.id
      redirect_to bienvenue_index_path, :notice => "Signed in!"
  end

  def destroy
  session[:player_id] = nil
  redirect_to root_url, :notice => "Signed out!"
  end
end

そして私のプレーヤーモデル:

class Player < ActiveRecord::Base



  attr_accessible :email, :gender, :habitation, :image, :nom, :nom_complet, :prenom, :provider, :token, :uid, :taille, :poids, :pied, :poste_prefere, :vehicule
  has_many :matches
  has_many :activities

  validates_presence_of :prenom
  validates_presence_of :nom

  def self.create_with_omniauth(auth)

    large = "http://graph.facebook.com/#{auth["uid"]}/picture?type=large"

      create! do |player|
        player.provider = auth["provider"]
        player.uid = auth["uid"]
        player.nom_complet = auth["info"]["name"]
        player.nom = auth["info"]["last_name"]
        player.prenom = auth["info"]["first_name"]
        player.image = auth["info"]["image"]
        player.image_large = large
        player.email = auth["info"]["email"]
        player.gender = auth["extra"]["raw_info"]["gender"]
        player.habitation = auth["extra"]["raw_info"]["location"]["name"]          
        player.token = auth["credentials"]["token"]

      end
    end 

end
4

2 に答える 2

3

この同じエラー鉱山につまずいた他の人にとっては、別の問題が原因でした。

の場所で修正しskip_before_filter :authenticateましたUsers::OmniauthCallbacksController

これがうまくいったと思う理由:

最初に、omniauth_facebook gem でこのバグへの道をたどりました。

これは、エラー メッセージが 2 つの FB コールバック リクエストが立て続けに送信されているという事実に関連しているという事実を浮き彫りにしました。残念ながら、omniauth の詳細を 2 回定義していなかったので、最初はそれがどこから来ているのかわかりませんでした。

それから私はApplicationController私が持っていることに気づきましたbefore_filter :authenticate。Facebook のコールバック リクエストがこの認証バリアにぶつかり、すぐに新しい認証をリクエストしたことが原因だと思います。

このアクションをスキップするようにDeviseに指示すると、問題が解決しました。

于 2013-05-31T14:12:33.090 に答える
1

わかりました、私は解決策を見つけました。

私のモデルではplayer.rb、この行:

player.habitation = auth["extra"]["raw_info"]["location"]["name"]

1 人のプレーヤーに対して Nil を返しました。

この行をコメントすると、問題が修正されました。お役に立てれば

于 2013-02-02T16:20:20.107 に答える