0

Я наносил удар по стене. Я задал подобный вопрос, подумал, что у меня есть ответ, но я этого не сделал. Теперь я более информирован, но все еще полностью потерян. Вот что я пытаюсь сделать:Rails 4, Devise, Twitter & Facebook API

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

Представляется, что в рамках модели идентичности (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 

или любую другую строку, которая у вас есть у поставщика.

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

+0

Большое вам спасибо. Я ударил себя в голову, когда понял, насколько это очевидно. – socialconquest

Смежные вопросы