Rails 3 с помощью Devise: как разрешить кому-либо войти в систему, используя свою учетную запись Facebook?

У меня есть приложение Rails 3, использующее Devise для аутентификации. Теперь мне нужно разрешить кому-либо войти в систему, используя свою учетную запись Facebook. Я думаю, что это называется Facebook Connect, но я также слышал термин Facebook Graph API, поэтому я не уверен, о чём я прошу.

Что мне нужно сделать, чтобы интегрировать Facebook Connect с Devise?

Решение:

Этот вопрос сейчас довольно старый. Год назад Devise v1.2 представил OmniAuth поддержку. Теперь Devise находится на v2.1 (начиная с этой записи), и использование OmniAuth еще проще. Вот отличный учебник из вики Devise на с помощью omniauth-facebook gem с помощью Devise, чтобы разрешить вход с помощью Facebook.

Также ознакомьтесь с этим замечательным руководством по регистрации вашего приложения и работы с API-интерфейсом Facebook.

Ответ 1

Теперь Devise 1.2 поставляется с поддержкой входа в facebook с использованием omniauth и работает с Rails 3.0. Проверьте запись в вики.

Ответ 2

Я проверил страницу разработчика github, чтобы узнать, что они сделали. Этот проект движется довольно быстро, и, как это бывает, у них есть поддержка для подключения facebook между прочим. Ознакомьтесь с разделом OAuth2. Они используют github в качестве примера, но это будет одно и то же для facebook, и они упоминают различия. Я думаю, что это путь, сторонние драгоценные камни для разработки не двигаются так быстро, как изобретатель или рельсы. Приветствия.

Здесь ссылка http://github.com/plataformatec/devise

Edit

Конечно, я очень мало кодировал здесь, в основном, по умолчанию, так что:

Создайте новое приложение и добавьте эти драгоценные камни в gemfile.

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

Запустите пакетную установку, затем эти команды перейдут к базовой модели идентификации пользователя.

rails generate devise:install
rails generate devise User

В config/initializers/devise.rb раскомментируйте/измените их. Посмотрите на последний параграф о том, где вы получите app_key и секрет из facebook.

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

Это должна быть ваша модель пользователя.

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 использует корень: to = > "something # here", поэтому я создал домашний контроллер с действием индекса и использовал его для запуска приложения. Но, не об этом. Я поместил это в layout/application.html.erb, чтобы у меня были базовые знаки 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>

Разработать в значительной степени забота обо всем остальном для нас. То, что вам нужно сделать, это получить ваш app_key и секрет из facebook (используется в файле конфигурации devise.rb). Эта ссылка должна вас поймать. http://developers.facebook.com/setup

Ответ 3

В моем приложении я использую omniauth, который, я думаю, вышел после ответа на этот вопрос.

https://github.com/intridea/omniauth

Ответ 4

Этот пост в блоге сделал это для меня. Посмотрите на него.

Ответ 5

Просто используемое решение Hugo практически без проблем. Вот код User.rb, который я должен был использовать:

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

В этом коде все изменилось:

  • name находится в attr_accessible (не забудьте добавить поле имени пользователю)
  • изменено декодирование JSON

Ответ 7

Вот небольшое приложение с интеграцией с Devise + Twitter + Facebook + Linkedin + Google + Github. Все в одном месте.

Здесь вы можете найти источник здесь и демо здесь