2012-04-12 19 views
8

मैं NoamB द्वारा Sorcery Authentication Gem के संस्करण 0.7.7 का उपयोग कर रहा पर के लिए user_info_mapping मेरी Rails 3.2 Appटोना रत्न - कस्टम बाहरी प्रदाताओं

मैं एक संभावना कैसे मैं एक तरीका है जिसके उपयोगकर्ता की जानकारी मानचित्रण कर रहा है ऊपर हुक कर सकते हैं रहा हूँ एक विशिष्ट external login provider (e.g. facebook, twitter) के लिए।

उदाहरण के लिए मैं अपने डेटाबेस में उपयोग किए गए प्रारूप में प्रदान किए गए लोकेल को बदलना चाहता हूं या मैं मिलान प्रक्रिया से हिस्से के रूप में ट्विटर से उपयोगकर्ता अवतार डाउनलोड करना चाहता हूं।

डिफ़ॉल्ट रूप से यह sorcery.rb फ़ाइल पर इस तरह से ही संभव है:

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

मैं जानता हूँ कि मैं अपने उपयोगकर्ता मॉडल पर सेटर तरीकों के साथ इस तरह के व्यवहार को प्राप्त कर सकते, लेकिन मैं इन बातों को मॉडल से अलग रखना चाहते हैं और मैं विशेष रूप से प्रत्येक प्रदाता के लिए उन्हें परिभाषित करने में सक्षम होना चाहता हूं।

क्या यह संभव है? / ऐसे विस्तारित मानचित्रण विकल्पों को लागू करने का सबसे अच्छा तरीका क्या है?

आपकी मदद के लिए धन्यवाद!

उत्तर

0

ऐसा लगता है कि आप विभिन्न सॉर्सी प्रदाता कक्षाओं को विस्तारित करके एप्लिकेशन-विशिष्ट फ़ील्ड को जोड़कर ऐसा कर सकते हैं जो आप उपयोगकर्ता जानकारी हैश चाहते हैं।

उदाहरण के लिए, ट्विटर का उपयोग करने के लिए आप की तरह कुछ हो सकता है इस में परिभाषित किया गया:

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 

(मैं नहीं है इस कोड को चलाने का प्रयास किया, इसलिए विवरण थोड़ा सा हो सकता है, लेकिन जादूगर स्रोत कोड पढ़ने से यह सही दिशा की तरह दिखता है।)

संबंधित मुद्दे