मुझे पता है कि यह कई बार पूछा गया है, लेकिन जवाब मेरे लिए पूरी तरह से स्वीकार्य नहीं हैं।रेल 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
मुद्दे से निपटने करना होगा।
तो मैं सभी ओथ प्रदाताओं के लिए उस आवश्यकता को कैसे ओवरराइड कर सकता हूं?