2016-07-01 10 views
8

मुझे पता है कि यह कई बार पूछा गया है, लेकिन जवाब मेरे लिए पूरी तरह से स्वीकार्य नहीं हैं।रेल 5, डेविस, Omniauth, ट्विटर

इसलिए मैं इस विषय के बारे Ryan Bates' Railscast अनुसरण कर रही हूं, और मिश्रण है कि के साथ आधिकारिक Devise Omniauth guide (कि अमेरिकन प्लान पर आधारित है), लेकिन मैं तो बस की तरह मैं उम्मीद यह काम करने के लिए नहीं मिल रहा है, इसलिए मैं कुछ मदद प्यार होता।

मैं एक 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 

मैं समस्याओं की एक किस्म में चलाने पर दो तरीकों की है। सबसे तात्कालिक यह है कि मैं पासवर्ड सेट कर रहा हूं, जब उपयोगकर्ता लॉगिन करने का प्रयास करते हैं तो उपयोगकर्ता पासवर्ड नहीं जानता (और मैं पुष्टि के बाद उन्हें स्वचालित रूप से साइन इन नहीं करता)।

लेकिन अगर मैं पासवर्ड सेट नहीं करता हूं, तो यह पासवर्ड को सेट करने के लिए नहीं कहता है ... तो यह भी अजीब है।

ये मेरी 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 

तो मेरे सवाल यह है जब कोई ट्विटर के माध्यम से साइन अप करता है, वे एक पासवर्ड दर्ज करने की आवश्यकता है है? मैं उन्हें स्वचालित रूप से registration/new.html.erb पर भेजता हूं क्योंकि ट्विटर ईमेल मान वापस नहीं करता है। लेकिन मैं इसे अनुकूलित करने से पहले प्रक्रिया को पहले काम करने की कोशिश कर रहा हूं।

मैं पासवर्ड समस्या से कैसे निपटूं?

संपादित करें 1

अधिक स्पष्टता के लिए, मैं OAuth प्रदाता की परवाह किए बिना इस password_required मुद्दे से निपटने करना होगा।

तो मैं सभी ओथ प्रदाताओं के लिए उस आवश्यकता को कैसे ओवरराइड कर सकता हूं?

उत्तर

5

आप User वर्ग के लिए the following method जोड़ना चाहिए:

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

के बाद से ट्विटर उपयोगकर्ता के ईमेल वापस नहीं करता है, तो आप भी tweak that email validation कर सकते हैं, लेकिन registration/new.html.erb करने के लिए उपयोगकर्ता पुनः निर्देशित की तरह आप पहले से ही कर रहे हैं की तरह लगता है मेरे लिए सही दृष्टिकोण।

संबंधित मुद्दे