2012-04-12 4 views
8

Я использую версию 0.7.7 из Sorcery Authentication Gem по NoamB на моем Rails 3.2 AppВолшебство Gem - Пользовательские user_info_mapping для внешних поставщиков

Ищу возможность, как я могу подключить метод, который делает информационное отображение пользователей для конкретного external login provider (e.g. facebook, twitter).

Например, я хочу изменить предоставленный языковой стандарт в формат, который я использую в своей базе данных, или я хочу загрузить аватар пользователя из twitter как часть процесса сопоставления.

По умолчанию можно только таким образом над sorcery.rb файла:

config.facebook.user_info_mapping = {:email => "email", :first_name => "first_name", :last_name => "last_name" ... 

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

Возможно ли это? / Каков наилучший способ реализации таких расширенных вариантов отображения?

Благодарим за помощь!

ответ

0

Похоже, вы могли бы это сделать, расширив классы провайдеров Sorcery, чтобы добавить поля, специфичные для приложения, для хеша информации о пользователе.

Например, чтобы использовать Twitter вы можете иметь что-то вроде этого определено:

config.external_providers = [:twitter] 

Вы можете изменить это:

config.external_providers = [:TwitterWithAvatar] 

Теперь вам нужно определить TwitterWithAvatar поставщика под Sorcery::Providers, и переопределить метод #get_user_hash:

module Sorcery 
    module Providers 
    class TwitterWithAvatar < Twitter 
     def get_user_hash(access_token) 
     user_hash = super 
     user_hash.merge(
      avatar: get_avatar(user_hash[:uid]), 
     ) 
     end 

     private 

     def get_avatar(uid) 
     # Some Twitter API call 
     end 
    end 
    end 
end 

Теперь вы можете настроить отображение:

config.TwitterWithAvatar.user_info_mapping = {avatar: "avatar"} 

В качестве альтернативы, так как вы уже используете пользовательский класс поставщика, вы можете переместить отображение в этом классе:

module Sorcery 
    module Providers 
    class TwitterWithAvatar < Twitter 
     def user_info_mapping 
     { 
      avatar: "avatar", 
      # ... 
     } 
     end 
    end 
    end 
end 

(я не имею попробовал запустить этот код, поэтому детали могут быть немного отключены, но из чтения исходного кода Sorcery это выглядит как правильное направление.)

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