Как заставить логин, после фейсбука подключиться? - PullRequest
1 голос
/ 11 марта 2012

Я использую Rails, Devise и Omniauth и пытаюсь войти через Facebook connect.

Но после части Facebook меня перенаправляют на «/ users / sign_in # = » в моем приложении.

Согласно журналу (см. Код), пользователь сохраняется, поэтому этот обратный вызов вызывает метод sign_in_and_redirect:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    # You need to implement the method below in your model
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)

    if @user.persisted?
      logger.debug "User #{@user.email} is persisted"
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
      sign_in_and_redirect @user, :event => :authentication
    else
      logger.error "User #{@user.email} is not persisted"
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end
end

Что может быть не так?

Примечание: я использую MongoID, не знаю, имеет ли это значение. Пользователь правильно добавляется в БД.

ОБНОВЛЕНИЕ : Я только что заметил, что Devise отправляет мне электронное письмо для подтверждения моей регистрации, даже когда я использую Facebook для аутентификации. Может в этом проблема? Как сделать пользовательскую модель: подтверждаемой, кроме случаев аутентификации с помощью facebook? Это возможно? Вот моя модель пользователя:

class User
  include Mongoid::Document
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable, :omniauthable

  ## Database authenticatable
  field :email,              :type => String, :null => false, :default => ""
  field :encrypted_password, :type => String, :null => false, :default => ""

  ## Recoverable
  field :reset_password_token,   :type => String
  field :reset_password_sent_at, :type => Time

  ## Rememberable
  field :remember_created_at, :type => Time

  ## Trackable
  field :sign_in_count,      :type => Integer, :default => 0
  field :current_sign_in_at, :type => Time
  field :last_sign_in_at,    :type => Time
  field :current_sign_in_ip, :type => String
  field :last_sign_in_ip,    :type => String

  ## Encryptable
  # field :password_salt, :type => String

  ## Confirmable
  field :confirmation_token,   :type => String
  field :confirmed_at,         :type => Time
  field :confirmation_sent_at, :type => Time
  field :unconfirmed_email,    :type => String # Only if using reconfirmable

  ## Lockable
  # field :failed_attempts, :type => Integer, :default => 0 # Only if lock strategy is :failed_attempts
  # field :unlock_token,    :type => String # Only if unlock strategy is :email or :both
  # field :locked_at,       :type => Time

  ## Token authenticatable
  # field :authentication_token, :type => String

  def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
    data = access_token.extra.raw_info
    if user = User.where(:email => data.email).first
      user
    else # Create a user with a stub password. 
      User.create!(:email => data.email, :password => Devise.friendly_token[0,20]) 
    end
  end

  def self.new_with_session(params, session)
    super.tap do |user|
      if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"]
        user.email = data["email"]
      end
    end
  end
end

Я взял код из документации по devise / omniauth: https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Чтобы избежать такого поведения, вам просто нужно определить поле Verified_at, когда вы авторизуетесь на Facebook.

В вашем методе find_for_facebook_oauth в вашей модели вам нужно добавить :confirmed_at => Time.now в вашем пользовательском создании.

0 голосов
/ 12 марта 2012

Пришлось изменить метод find_for_facebook_oauth, чтобы пропустить подтверждение

def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
  data = access_token.extra.raw_info
  if user = User.where(:email => data.email).first
    user
  else # Create a user with a stub password. 
    user = User.new(:email => data.email, :password => Devise.friendly_token[0,20])
    user.skip_confirmation!
    user.save! 
    user
  end
end

Теперь это работает, но все равно добавляет мусор в URL.Я перенаправлен на '/ # = ', который показывает домашнюю страницу.Я отправлю еще один вопрос для этого.

...