Разработайте Omniauth «encrypted_password не может быть NULL» для нового пользователя - PullRequest
9 голосов
/ 10 июля 2011

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

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

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

authentations_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

user.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

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

1 Ответ

15 голосов
/ 11 июля 2011

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

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

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

...