viernes, 10 de mayo de 2013

Conectar Rails con Facebook, Twitter (II)


En esta entrada continuaremos con algo que habñia dejado hace tiempo. Un tutorial para conctar nuestra aplicación con Rails y devise con las redes sociales. En la primera parte de  Conectar Rails con Facebook y Twitter,  explicaba los pasos necesarios para conseguir los identificadores de aplicación y configurar  devise.
Ahora, el paso que queda, es simplemente implementar un callback que obtenga los datos del usuario de la red social y lo relacione con el nuestro.
Primero, deberemos definir en el fichero routes.rb dónde queremos que vaya el callback:
devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }

Esto provoca que el callback al volver de Facebook, Twitter, ... vaya a nuestro controlador. Este controlador (Users::OmniauthCallbacksController) deberá definir los métodos de las estrategias usadas:

  def twitter
    @user = User.find_for_twitter_oauth(request.env["omniauth.auth"], current_user, request.remote_ip)

    if @user.persisted?
      sign_in_and_redirect @user, :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"]
      redirect_to root_url 
    end
  end

Así, buscaremos al usuario por su UID de la red social (Twitter, en este caso). Deberemos implementar este método en el modelo de usuario de devise:

  def self.find_for_twitter_oauth(auth, signed_in_resource=nil, location = nil)
    user = User.where(:provider => auth.provider, :uid => auth.uid).first
    unless user
      user = User.create(name: auth.extra.raw_info.name,
                         provider: auth.provider,
                         uid: auth.uid,
                         email: auth.info.email || auth.extra.raw_info.screen_name,
                         password: Devise.friendly_token[0, 20]
      )

      user.save
    end

    user.save

    user
  end

Ahora ya tendremos el usuario. En caso de que no existiera, se crea uno nuevo en base de datos. Esto depende si queremos conectar la cuenta de Twitter de nuestro usuario con la aplicación, o queremos directamente un login mediante el propio usuario .

Con esto, a falta de algún detalle, estaría listo el proceso de autenticaciṕn de usuarios mediante Twitter, Facebook, Github, Google Plus, ...