Rails 4, Devise, Twitter & Facebook API

Я разбил голову об стену по этому поводу. Я задал похожий вопрос, думал, что у меня есть ответ, но я этого не сделал. Теперь я более информирован, но все еще полностью потерян. Вот что я пытаюсь сделать:

  • Создайте демонстрационное приложение, показывающее использование API Twitter и Facebook при проведении кроссплатформенного сетевого анализа.
  • Иметь один стандартный логин для каждого пользователя на основе адреса электронной почты и пароля.
  • Аутентифицируйте каждого пользователя через Facebook и Twitter, используя (желательно встроенную функцию разработки) присягу и сохраняя их токен и секрет в базе данных.
  • Пользователь нажимает на значок Facebook/ Twitter и, если он вошел в систему (с помощью электронной почты и пароля), он получает свои учетные данные Facebook/ Twitter, упаковывает их с учетными данными доступа к приложению и отправляет их с запросами API для просмотра пользователей.
  • Я использовал эту сборку в качестве базы приложений, приложения настроены на твиттер и фейсбук, и аутентификации работают - https://github.com/alex-klepa/rails4-bootstrap-devise-cancan-omniauth

Похоже, что в модели Identity (User's have_many Identities - те, которые являются oauth-стратегиями) токен и секрет хранятся провайдером, но я не могу получить к ним доступ с помощью своих средств в контроллере.

Вот модели:

user.rb
class User
  include Mongoid::Document
  include Mongoid::Timestamps
  include User::AuthDefinitions
  include User::Roles

  has_many :identities


  field :email, type: String
  field :image, type: String
  field :first_name, type: String
  field :last_name, type: String
  field :roles_mask, type: Integer

  validates_presence_of :email, :first_name, :last_name

  def full_name
    "#{first_name} #{last_name}"
  end

end



identity.rb
class Identity
  include Mongoid::Document
  include Mongoid::Timestamps

  belongs_to :user, index: true

  field :uid, type: String
  field :provider, type: String
  field :token, type: String
  field :secret, type: String
  field :expires_at, type: DateTime

  field :email, type: String
  field :image, type: String
  field :nickname, type: String
  field :first_name, type: String
  field :last_name, type: String

  index({ uid: 1, provider: 1 }, { unique: true })


  def self.from_omniauth(auth)
    identity = where(auth.slice(:provider, :uid)).first_or_create do |identity|
    identity.provider     = auth.provider
    identity.uid          = auth.uid
    identity.token        = auth.credentials.token
    identity.secret       = auth.credentials.secret if auth.credentials.secret
    identity.expires_at   = auth.credentials.expires_at if auth.credentials.expires_at
    identity.email        = auth.info.email if auth.info.email
    identity.image        = auth.info.image if auth.info.image
    identity.nickname     = auth.info.nickname
    identity.first_name   = auth.info.first_name
    identity.last_name    = auth.info.last_name
  end
  identity.save!

  if !identity.persisted?
    redirect_to root_url, alert: "Something went wrong, please try again."
  end
  identity
end

def find_or_create_user(current_user)
  if current_user && self.user == current_user
    # User logged in and the identity is associated with the current user
    return self.user
  elsif current_user && self.user != current_user
    # User logged in and the identity is not associated with the current user
    # so lets associate the identity and update missing info
    self.user = current_user
    self.user.email       ||= self.email
    self.user.image       ||= self.image
    self.user.first_name  ||= self.first_name
    self.user.last_name   ||= self.last_name
    self.user.skip_reconfirmation!
    self.user.save!
    self.save!
    return self.user
  elsif self.user.present?
    # User not logged in and we found the identity associated with user
    # so let's just log them in here
    return self.user
  else
    # No user associated with the identity so we need to create a new one
    self.build_user(
      email: self.email,
      image: self.image,
      first_name: self.first_name,
      last_name: self.last_name,
      roles: [AppConfig.default_role]
    )
    self.user.save!(validate: false)
    self.save!
    return self.user
  end
end

  def create_user

  end

конец

1 ответ

Решение

Так что просмотр всех идентификаторов должен быть доступен через

@user = User.find(<<add id here >)
@user.identities.all

Чтобы найти конкретную личность, вы можете сделать:

@user.identities.where(provider: 'facebook').first

или любую строку, которую вы имеете для провайдера.

Вы также можете определить метод в пользовательской модели для каждой из идентичностей.

Другие вопросы по тегам