2016-07-01 14 views
8

これは何度も尋ねられたことがわかっていますが、答えは決して私には受け入れられません。Rails 5、Devise、Omniauth、Twitter

このトピックについては、Ryan Bates' Railscastに従っており、公式Devise Omniauth guide(これはFBに基づいています)と混合していますが、期待したとおりに動作しないため、助けてください。

私はこのようになりますUsers::OmniauthCallbacksControllerあります

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def all 
    @user = User.from_omniauth(request.env["omniauth.auth"]) 

    if @user.persisted? 
     sign_in_and_redirect root_path, :event => :authentication #this will throw if @user is not activated 
     set_flash_message(:notice, :success, :kind => "Twitter") if is_navigational_format? 
    else 
     session["devise.twitter_data"] = request.env["omniauth.auth"].except("extra") 
     flash[:notice] = flash[:notice].to_a.concat resource.errors.full_messages 
     redirect_to new_user_registration_url 
    end 
    end 

    alias_method :twitter, :all 

    def failure 
    redirect_to root_path 
    end 
end 

は、その後、私はまた、私は様々な問題に遭遇し、私のUser.rb

def self.from_omniauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.update(
     email: auth.info.email, 
     password: Devise.friendly_token[0,20], 
     username: auth.info.nickname, 
     remote_avatar_url: auth.info.image, 
     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], 
      username: data["info"]["nickname"], 
      remote_avatar_url: data["info"]["image"], 
      token: data["credentials"]["token"], 
      secret: data["credentials"]["secret"] 
     ) 
     end 
    end 
    end 

上の2つのメソッドを持っています。最も直ちに私はパスワードを設定しているので、ユーザーはログインしようとするとパスワードを知らない(そして私は確認時に自動サインインしない)。

パスワードを設定しないと、パスワードの設定は求められません。ちょっと変わってしまいます。

これらは私のUserモデル上の私の工夫設定です:

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, 
     :confirmable, :omniauthable, :omniauth_providers => [:twitter] 

    validates :username, 
    presence: true, 
    uniqueness: { 
     case_sensitive: false 
    } 

    validate :validate_username 

    def validate_username 
    if User.where(email: username).exists? 
     errors.add(:username, :invalid) 
    end 
    end 

だから私の質問は、誰かがツイッター経由でサインアップするとき、彼らはパスワードを入力する必要がない、これですか? Twitterはメールの価値を返さないので、私は自動的にregistration/new.html.erbに送信します。しかし、私は、プロセスを最適化する前に、最初に作業させようとしています。

どのようにパスワードの問題に対処しますか?

編集1

より明確にするために、私は関係なく、OAuthのプロバイダのこのpassword_required問題に対処する必要があります。

どのようにすべてのOAuthプロバイダの要件を上書きできますか?

答えて

5

あなたはUserクラスにthe following methodを追加する必要があります

def password_required? 
    (provider.blank? || uid.blank?) && super 
end 

のTwitterは、ユーザーの電子メールを返さないので、あなたもtweak that email validationにしたいが、あなたはすでにやっているようregistration/new.html.erbにユーザーをリダイレクトするように思えるかもしれ正しいアプローチ。

関連する問題