これは何度も尋ねられたことがわかっていますが、答えは決して私には受け入れられません。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プロバイダの要件を上書きできますか?