Rails 3 za pomocą Devise: jak zezwolić komuś na zalogowanie się za pomocą konta Facebook?

Mam aplikację Rails 3 używającą Devise do uwierzytelniania. Teraz muszę pozwolić komuś zalogować się za pomocą konta Facebook. Chyba Facebook Facebook Connect, ale słyszałem również termin Facebook Graph API, więc nie jestem pewien, który z nich pytam.

Co muszę zrobić, aby zintegrować Facebook Connect z Devise?

Rozwiązanie:

To pytanie jest już dość stare. Rok temu Devise v1.2 wprowadził obsługę OmniAuth . Teraz Devise jest w wersji 2.1 (w chwili pisania tego tekstu) i korzystanie z OmniAuth jest jeszcze łatwiejsze. Poniżej znajduje się świetny samouczek z Devise wiki na temat za pomocą klejnotu omniauth-facebook z Devise, aby umożliwić logowanie za pomocą Facebook.

Sprawdź również ten świetny samouczek na temat rejestracji aplikacji i pracy z Facebook Graph API .

Author: Andrew, 2010-08-27

7 answers

Devise 1.2 jest teraz wyposażony w obsługę logowania na facebook ' u przy użyciu omniauth i działa z Rails 3.0. Sprawdź wpis wiki .

 21
Author: Yeameen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-31 04:57:58

Sprawdziłem stronę devise github, aby zobaczyć, co robią. Ten projekt porusza się dość szybko i jak to się dzieje, że mają wsparcie dla facebook connect między innymi. Sprawdź sekcję OAuth2. Używają Githuba jako przykładu, ale to samo byłoby z facebook ' em i wspominają o różnicach. Myślę, że jest to droga, perełki innych firm dla devise nie poruszają się tak szybko, jak devise lub rails. Zdrowie.

UPS oto link http://github.com/plataformatec/devise

Edit

Oczywiście zrobiłem bardzo mało kodowania tutaj głównie poszedł z domyślnym, więc tutaj idzie:

Utwórz nową aplikację i dodaj te klejnoty do pliku gemfile.

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

Uruchom bundle install, a następnie te polecenia wprowadzą podstawowy model uwierzytelniania użytkownika.

rails generate devise:install
rails generate devise User

W config/initializers / devise.RB uncomment / modify these. Spójrz na ostatni akapit, skąd masz app_key i secret od facebook.

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

To powinien być twój model użytkownika.

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 używa root :to = > "something#here", więc stworzyłem kontroler domowy z akcją index i użyłem go do rootowania aplikacji. Ale nieważne. Umieściłem to w layout/aplikacji.html.erb tak, że miałem podstawowe trasy 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 dba o Wszystko inne. To, co musisz zrobić, to uzyskać app_key i secret z facebook (używane w devise.RB config plik). Ten link powinien ci pomóc. http://developers.facebook.com/setup
 54
Author: Hugo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-01 00:46:04

W mojej aplikacji używam omniauth, który myślę, że wyszedł trochę po odpowiedzi na to pytanie.

Https://github.com/intridea/omniauth

 8
Author: alvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-10 17:50:42

This blog post did it for me. Spójrz na to.

 6
Author: mikewilliamson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-03 01:03:28

Po prostu użyłem rozwiązania Hugo bez prawie żadnego problemu. Oto użytkownik.kod rb, którego musiałem użyć:

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

Rzeczy się zmieniły w tym kodzie:

  • nazwa jest w attr_accessible (nie zapomnij dodać pola nazwa do użytkownika)
  • zmieniono dekodowanie JSON
 6
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-09 21:25:42

Http://github.com/grimen/devise_facebook_connectable

Ten klejnot na GitHubie jest dość prosty. Warto spróbować!

 3
Author: morcutt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-28 00:30:50

Oto mała aplikacja z integruje się z Devise + Twitter + Facebook + Linkedin + Google + Github. Wszystko w jednym miejscu.

Możesz znaleźć źródło tutaj oraz demo TUTAJ

 1
Author: Mohit Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-27 14:57:24