Зашифрованный_пароль Devise Omniauth не может быть NULL для нового пользователя

Я использую Devise с Omniauth, чтобы пользователи могли входить в мое приложение через Facebook. Я использовал учебники Railscast, чтобы запустить его.

Если пользователь уже является участником моего сайта, аутентификация через facebook работает нормально. Проблема возникает при аутентификации нового пользователя в facebook. Когда дело доходит до создания нового пользователя для моей модели пользователя, я получаю сообщение об ошибке «users.encrypted_password не может быть NULL». Я не могу понять, как передать пароль модели пользователя из информации Facebook.

Вот что у меня есть:

аутентификации_controller.rb

class AuthenticationsController < ApplicationController
 def index
  @authentications = current_user.authentications if current_user
 end

def create
  omniauth = request.env["omniauth.auth"]
  authentication = Authentication.find_by_provider_and_uid(omniauth['provider'],   omniauth['uid'])
 if authentication
   flash[:notice] = "Signed in successfully."
   sign_in_and_redirect(:user, authentication.user)
 elsif current_user
   current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'])
   flash[:notice] = "Authentication successful."
   redirect_to authentications_url
 else
   user = User.new
   user.apply_omniauth(omniauth)
   if user.save
     flash[:notice] = "Signed in successfully."
     sign_in_and_redirect(:user, user)
   else
     session[:omniauth] = omniauth.except('extra')
     redirect_to new_user_registration_url
   end
  end
end

пользователь.rb

 def apply_omniauth(omniauth)
  self.email = omniauth['user_info']['email'] if email.blank?
  authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid'])
 end


 def password_required?
   (authentications.empty? || !password.blank?) && super
 end

Любая помощь будет здорово, спасибо заранее!


person looloobs    schedule 10.07.2011    source источник


Ответы (1)


Добавьте :password => Devise.friendly_token[0,20] при создании нового пользователя из facebook omniauth.

Я считаю, что Devise ожидает что-то в поле пароля для создания пользователя. Поскольку при использовании Facebook oauth пароль не используется (по крайней мере, не на стороне вашего приложения), вам просто нужно создать фиктивный пароль, как показано выше.

См. дополнительную информацию: https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

person Kevin Tsoi    schedule 10.07.2011
comment
Большое спасибо, я пытался реализовать это раньше, но, видимо, неправильно. Теперь все работает нормально. Надеюсь, эта ссылка может помочь кому-то еще. - person looloobs; 12.07.2011
comment
и может ли пользователь знать, что такое пароль? - person アレックス; 01.04.2015