web-dev-qa-db-fra.com

Rails 3 en utilisant Devise: Comment permettre à quelqu'un de se connecter en utilisant son compte Facebook?

J'ai une application Rails 3 utilisant Devise pour l'authentification. Maintenant, je dois autoriser quelqu'un à se connecter en utilisant son compte Facebook. Je pense que cela s'appelle Facebook Connect, mais J'ai également entendu le terme Facebook Graph API, donc je ne sais pas lequel je demande.

Que dois-je faire pour intégrer Facebook Connect à Devise?

Solution:

Cette question est assez ancienne maintenant. Il y a un an, Devise v1.2 a introduit le support OmniAuth . Maintenant, Devise est à la version 2.1 (au moment d'écrire ces lignes) et l'utilisation d'OmniAuth est encore plus facile. Voici un excellent tutoriel du wiki Devise sur en utilisant le omniauth-facebook gem avec Devise pour autoriser la connexion via Facebook .

Consultez également ce super tutoriel sur enregistrement de votre application et utilisation de l'API Facebook Graph .

65
Andrew

Devise 1.2 est désormais livré avec un support de connexion Facebook utilisant omniauth et fonctionne avec Rails 3.0. Consultez la entrée wiki .

21
Yeameen

J'ai vérifié la page Github de l'appareil pour voir ce qu'ils faisaient. Ce projet se déroule assez rapidement et il se trouve qu'ils ont un support pour la connexion Facebook entre autres. Consultez la section sur OAuth2. Ils utilisent github comme exemple, mais ce serait la même chose pour Facebook et ils mentionnent des différences. Je pense que c'est la voie à suivre, les gemmes tierces pour les appareils ne se déplacent pas aussi vite que l'appareil ou Rails do. Cheers.

Oups, voici le lien http://github.com/plataformatec/devise

Modifier

Bien sûr, j'ai fait très peu de codage ici, principalement avec la valeur par défaut, alors voici:

Créez une nouvelle application et ajoutez ces gemmes au gemfile.

gem 'devise', :git => 'git://github.com/plataformatec/devise.git'
gem 'oauth2', :git => 'git://github.com/intridea/oauth2.git'

Exécutez l'installation de l'ensemble, puis ces commandes vous permettent de démarrer avec un modèle d'authentification utilisateur de base.

Rails generate devise:install
Rails generate devise User

Dans config/initializers/devise.rb décommentez/modifiez ces derniers. Regardez le dernier paragraphe pour savoir où vous obtenez app_key et le secret de Facebook.

config.oauth :facebook, 'app_key', 'secret',
    :site              => 'https://graph.facebook.com',
    :authorize_path    => '/oauth/authorize',
    :access_token_path => '/oauth/access_token'

Cela devrait être votre modèle d'utilisateur.

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 utilise une racine: to => "something # here", j'ai donc créé un contrôleur domestique avec une action d'index et l'ai utilisé pour rooter l'application. Mais peu importe. J'ai mis cela dans layout/application.html.erb afin d'avoir des routes sign_n sign_out de base.

<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 s'occupe à peu près de tout le reste pour nous. Ce que vous devez faire cependant, c'est récupérer votre clé_app et votre secret sur Facebook (utilisé dans le fichier de configuration devise.rb). Ce lien devrait vous aider à démarrer. http://developers.facebook.com/setup

54
Hugo

Dans mon application, j'utilise omniauth, qui je pense est sorti un peu après la réponse à cette question.

https://github.com/intridea/omniauth

8
alvin

Je viens d'utiliser la solution Hugo avec presque aucun problème. Voici le code User.rb que j'ai dû utiliser:

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

Les choses ont changé dans ce code:

  • le nom est dans attr_accessible (n'oubliez pas d'ajouter un champ de nom à l'utilisateur)
  • décodage JSON modifié
6
Chris

Ce article de blog l'a fait pour moi. Donnez-lui un coup d'oeil.

6
mikewilliamson

http://github.com/grimen/devise_facebook_connectable

Ce joyau sur github est assez simple. Vaut le coup!

3
morcutt

Voici une petite application avec intègre avec Devise + Twitter + Facebook + Linkedin + Google + Github. Tout en un seul endroit.

Vous pouvez trouver la source ici et une démo ici

1
Mohit Jain