ruby on rails - hacer - Rails 3 using Devise: ¿Cómo permitir que alguien inicie sesión usando su cuenta de Facebook?
login rails (7)
Tengo una aplicación de Rails 3 que usa Devise para la autenticación. Ahora necesito permitir que alguien inicie sesión usando su cuenta de Facebook. Creo que esto se llama Facebook Connect, pero también escuché el término Facebook Graph API, así que no estoy seguro de cuál estoy pidiendo.
¿Qué debo hacer para integrar Facebook Connect con Devise?
Solución:
Esta pregunta es bastante antigua ahora. Hace un año, Devise v1.2 introdujo el soporte OmniAuth . Ahora, Devise está en v2.1 (al momento de escribir esto) y usar OmniAuth es aún más fácil. Aquí hay un gran tutorial de la wiki de Devise sobre el uso de la gema omniauth-facebook
con Devise para permitir el inicio de sesión utilizando Facebook .
Consulte también este excelente tutorial sobre el registro de su aplicación y el trabajo con la API Graph de Facebook .
Aquí hay una pequeña aplicación que se integra con Devise + Twitter + Facebook + Linkedin + Google + Github. Todo en un lugar.
Puedes encontrar la fuente github.com/mohitjain/social-login-in-rails y una demostración here
Devise 1.2 ahora viene con soporte de inicio de sesión de Facebook usando omniauth y funciona con Rails 3.0. Mira la entrada de la wiki .
En mi aplicación, uso omniauth, que creo que salió un poco después de que esta pregunta fue respondida.
Esta publicación en el blog lo hizo por mí. Dale una mirada.
Revisé la página de github de diseño para ver qué estaban haciendo. Ese proyecto se está moviendo bastante rápido y, como ocurre, tienen compatibilidad para Facebook, entre otras cosas. Mira la sección en OAuth2. Usan github como ejemplo, pero sería lo mismo para facebook y mencionan las diferencias. Creo que este es el camino a seguir, las gemas de terceros para diseñar no se mueven tan rápido como lo hacen los rieles. Aclamaciones.
Vaya, aquí está el enlace Devise
Editar
Por supuesto, hice muy poca codificación aquí, la mayoría fue con el valor predeterminado, así que aquí va:
Crea una nueva aplicación y agrega estas gemas al gemfile.
gem ''devise'', :git => ''git://github.com/plataformatec/devise.git''
gem ''oauth2'', :git => ''git://github.com/intridea/oauth2.git''
Ejecute la instalación del paquete, luego estos comandos lo llevarán a un modelo básico de autenticación de usuario.
rails generate devise:install
rails generate devise User
En config / initializers / devise.rb descomentar / modificar estos. Mira el último párrafo sobre dónde obtienes app_key y el secreto de facebook.
config.oauth :facebook, ''app_key'', ''secret'',
:site => ''https://graph.facebook.com'',
:authorize_path => ''/oauth/authorize'',
:access_token_path => ''/oauth/access_token''
Este debería ser su modelo de usuario.
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable, :lockable, :timeoutable and :oauthable
devise :database_authenticatable, :oauthable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me
def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
# Get the user email info from Facebook for sign up
# You''ll have to figure this part out from the json you get back
data = ActiveSupport::JSON.decode(access_token)
if user = User.find_by_email(data["email"])
user
else
# Create an user with a stub password.
User.create!(:name => data["name"], :email => data["email"], :password => Devise.friendly_token)
end
end
end
Devise usa una raíz: to => "something # here", así que creé un controlador doméstico con una acción de índice y lo usé para rootear la aplicación. Pero no importa eso. Lo puse en layout / application.html.erb para tener las rutas básicas sign_n sign_out.
<span>
<%- if user_signed_in? %>
<%= "Signed in as #{current_user.full_name}. Not you?" %>
<%= link_to ''Sign out'', destroy_user_session_path %>
<%- else %>
<%= link_to ''Sign in'', new_user_session_path %>
<%- end %>
</span>
Devise prácticamente se ocupa de todo lo demás para nosotros. Lo que sí debes hacer es obtener tu app_key y el secreto de facebook (usado en el archivo de configuración devise.rb). Este enlace debería ayudarte a avanzar. http://developers.facebook.com/setup
Solo usé la solución de Hugo casi sin problema. Aquí está el código User.rb que tuve que usar:
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable, :lockable, :timeoutable and :oauthable
devise :database_authenticatable, :oauthable
# Setup accessible (or protected) attributes for your model
attr_accessible :name, :email, :password, :password_confirmation, :remember_me
def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
# Get the user email info from Facebook for sign up
# You''ll have to figure this part out from the json you get back
data = ActiveSupport::JSON.decode(access_token.get(''https://graph.facebook.com/me?''))
logger.info("received from Facebook: #{data.inspect}")
if user = User.find_by_email(data["email"])
user
else
# Create an user with a stub password.
User.create!(:name => data["name"], :email => data["email"], :password => Devise.friendly_token)
end
end
end
Las cosas cambiaron en este código:
- el nombre está en attr_accessible (no olvides agregar un campo de nombre al usuario)
- cambió la decodificación JSON
http://github.com/grimen/devise_facebook_connectable
Esta joya en github es bastante sencilla. ¡Merece un intento!