0

私はRyan BatesのtutorialをOmniauthとdevise(レールキャスト235の改訂版)の使い方で見て始めました。私はuser.rbファイルに問題があります。彼は彼のtutorialomniauth-twitter宝石と工夫とレールを使用する5

devise :omniauthable, # ... 
 

 
def self.from_omniauth(auth) 
 
    where(auth.slice(:provider, :uid)).first_or_create do |user| 
 
    user.provider = auth.provider 
 
    user.uid = auth.uid 
 
    user.username = auth.info.nickname 
 
    end 
 
end 
 

 
def self.new_with_session(params, session) 
 
    if session["devise.user_attributes"] 
 
    new(session["devise.user_attributes"], without_protection: true) do |user| 
 
     user.attributes = params 
 
     user.valid? 
 
    end 
 
    else 
 
    super 
 
    end 
 
end 
 

 
def password_required? 
 
    super && provider.blank? 
 
end 
 

 
def update_with_password(params, *options) 
 
    if encrypted_password.blank? 
 
    update_attributes(params, *options) 
 
    else 
 
    super 
 
    end 
 
end

に表示することは私のために働いて、それがActiveModelを表示::コードwhere(auth.slice(:provider, :uid)).first_or_create do |user|のこの行でForbiddenAttributesErrorが強調表示されません。私は彼のバージョンがRails 5を使用しているので動作しないと思っています。とにかく私はuser.rbファイルを修正しようとしました。次のコードを使用します。

def self.from_omniauth(auth) 
 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
 
    \t user.email = auth.info.email 
 
    user.password = Devise.friendly_token[0,20] 
 
    user.provider = auth.provider 
 
    user.uid = auth.uid 
 
    token = auth.credentials.token, 
 
    secret = auth.credentials.secret 
 
    end 
 
end 
 

 
def self.new_with_session(params, session) 
 
    super.tap do |user| 
 
     if data = session["devise.twitter_data"] 
 
     # user.attributes = params 
 
     user.update(
 
      email: params[:email], 
 
      password: Devise.friendly_token[0,20], 
 
      provider: data["provider"], 
 
      uid: data["token"], 
 
      token: data["credentials"]["token"], 
 
      secret: data["credentials"]["secret"] 
 
     ) 
 
     end 
 
    end 
 
    end 
 

 
def password_required? 
 
    super && provider.blank? 
 
end 
 

 
def update_with_password(params, *options) 
 
    if encrypted_password.blank? 
 
    update_attributes(params, *options) 
 
    else 
 
    super 
 
    end 
 
end 
 
end
私は約1分間の負荷を表示するにはTwitterの認証ページを取得し、すべてのエラーメッセージを表示せずに戻って私のユーザーへのリダイレクトでも署名せずにページをサインアップすることができる午前

。ちなみに、誰もが夢想を使ってFacebookにサインインする方法を知っています。

答えて

0

この問題は、self.from_omniauth(auth)に渡す属性authに関連しています。あなたはself.from_amniauth(auth)方法は、このauth.slice()は、それが何らかの形でfirst_or_create方法は、ユーザを作成することができる。また、エラー

で実行実行したときので、この変数はおそらく..

どのように見えるかを参照してください。サーバログにbinding.pryまたはputs authを設定する必要があります何かを見逃してエラーが発生する可能性があります。だから、デバッグショーで試してみてくださいuser.errors.full_messages

考えてみる方法は、Userを見つけるか、それを作成することです。それUsers::OmniauthCallbacksController#facebook

requestこれはあなたのサーバーからfacebookまたはtwitterに発信requestであることを意味し、コントローラのアクションから呼び出されます。..

FacebookやTwitterの情報が含まれている、AJAX responseでこのrequestに返信しますユーザーを認証する必要があります。

あなたのDBから userまたは findそれを作成するか where(provider: auth.provider, uid: auth.uid).first_or_create以下の方法で次に
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def facebook 
    # You need to implement the method below in your model (e.g. app/models/user.rb) 
    @user = User.from_omniauth(request.env["omniauth.auth"]) 

    if @user.persisted? 
     sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
     set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format?, you probably saved the env variable 
    else 
     session["devise.facebook_data"] = request.env["omniauth.auth"] 
     redirect_to new_user_registration_url 
    end 
    end 

    def failure 
    redirect_to root_path 
    end, you probably saved the env variable 
end 

。問題は、このアクションが持っているあなたは、おそらくhttps://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

から...

を間違ってこの方法を書いたり、間違ったパラメータでそれを呼び出し、またはあなたがapi正しく機能するためにTwitterを使用して設定していないされています

OmniAuthによってFacebookから取得されたすべての情報は、request.env ["omniauth.auth"]でハッシュとして入手できます。 OmniAuthのドキュメントとomniauth-facebookの宝石のREADMEをチェックして、どの情報が返されているかを確認してください。

有効なユーザーが見つかると、sign_inまたはsign_in_and_redirectという2つのDeviseメソッドのいずれかでサインインできます。合格:イベント=>:認証はオプションです。 Wardenコールバックを使用する場合にのみ、これを行う必要があります。

フラッシュメッセージは、Deviseのデフォルトメッセージの1つを使用して設定することもできますが、それはあなた次第です。

ユーザーが保持されていない場合は、セッションにOmniAuthデータを格納します。このデータは「devise」を使用して保存されます。キー名前空間として。これは、Deviseが「devise」で始まるすべてのデータを削除するので便利です。ユーザーがサインインするたびにセッションから削除されるため、自動セッションのクリーンアップが行われます。最後に、ユーザーを登録フォームに戻します。

コントローラが定義された後、我々は我々のモデル(例えばアプリ/モデル/ user.rb)でfrom_omniauthメソッドを実装する必要があります。

def self.from_omniauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
    user.email = auth.info.email 
    user.password = Devise.friendly_token[0,20] 
    user.name = auth.info.name # assuming the user model has a name 
    user.image = auth.info.image # assuming the user model has an image 
    # If you are using confirmable and the provider(s) you use validate emails, 
    # uncomment the line below to skip the confirmation emails. 
    # user.skip_confirmation! 
    end 
end 

この方法は、既存のユーザーを見つけようとしますプロバイダーとuidフィールドで指定します。ユーザーが見つからない場合は、ランダムなパスワードと追加の情​​報を含む新しいユーザーが作成されます。 first_or_createメソッドは、新しいユーザーを作成するときにプロバイダとuidフィールドを自動的に設定することに注意してください。最初のor_create!メソッドは、ユーザーレコードが検証に失敗した場合にExceptionを発生させることを除いて、同様に動作します。

関連する問題