2012-04-12 61 views
8

我使用Sorcery Authentication Gem通過NoamB的0.​​7.7版本我Rails 3.2 App法術寶石 - 自定義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" ... 

我知道我能做到與我的用戶模型setter方法這樣的行爲,但我想保留這些東西從模型中分離我希望能夠爲每個提供者專門定義它們。

這可能嗎? / 實現這種擴展映射選項的最佳方式是什麼?

感謝您的幫助!

回答

0

它看起來像你可以通過擴展各種Sorcery提供程序類來添加你想要的用戶信息哈希應用程序特定的字段。

例如,使用Twitter,你可能有這樣的定義:

config.external_providers = [:twitter] 

你可以將其更改爲:

config.external_providers = [:TwitterWithAvatar] 

現在你需要Sorcery::Providers下定義TwitterWithAvatar供應商,覆蓋#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 

(我沒有試着運行這段代碼,所以細節可能有點偏離,但從閱讀巫術源代碼看,這看起來像是正確的方向。)