2016-03-10 15 views
6

ओवरराइड करें मैं रेलवे 4 ऐप में ओमनीउथ के साथ डेविस 3.5 का उपयोग कर रहा हूं। मैंने फेसबुक के साथ एकीकरण बनाया है जो उपयोगकर्ता को अपने फेसबुक खाते को मेरे ऐप से कनेक्ट करने की अनुमति देता है। वर्तमान में जब उपयोगकर्ता कनेक्ट बटन पर क्लिक करता है, तो उन्हें /user/auth/facebook पर भेजा जाता है और फिर कॉलबैक यूआरएल पर रीडायरेक्ट किया जाता है जो Omniauth उत्पन्न करता है: /user/auth/facebook/callback। मैं कुछ मामलों में मैन्युअल रूप से इस कॉलबैक यूआरएल को ओवरराइड करना चाहता हूं - जिसका अर्थ है कि मैं इसे प्रारंभकर्ता में ओवरराइड नहीं करना चाहता - पूरी तरह से योग्य यूआरएल के साथ। उदाहरण के लिए, यदि कोई उपयोगकर्ता http://www.example.com/ पर शुरू होता है तो मैं http://app.example.com/user/auth/facebook/callback के साथ डिफ़ॉल्ट कॉलबैक यूआरएल को ओवरराइड करना चाहता हूं।डेविस/ओमनीएथ डिफ़ॉल्ट कॉलबैक यूआरएल

मेरे ऐप में गतिशील सबडोमेन हैं और उपयोगकर्ता (लगभग) हमेशा सबडोमेन पर प्रमाणीकरण प्रक्रिया शुरू करेंगे। दुर्भाग्यवश ऐसा लगता है कि फेसबुक ओथ रीडायरेक्ट यूआरएल में वाइल्डकार्ड का समर्थन नहीं करता है, यही कारण है कि मैं यह पता लगाने की क्षमता चाहता हूं कि कोई उपयोगकर्ता उप डोमेन पर है या कॉलबैक यूआरएल को उस चीज़ पर एडजस्ट करें जिसे मैंने अपने फेसबुक एप पर श्वेतसूची में रखा है ताकि प्राधिकरण प्रक्रिया सफल होती है।

जो मैंने पढ़ा है, उससे यूआरएल सहायक omniauth_authorize_path पैरामीटर के रूप में पारित होने के लिए अतिरिक्त तर्क स्वीकार करता है। मैं बहुत की तरह में एक कस्टम कॉलबैक पथ गुजर की कोशिश की है, लेकिन सफलता नहीं मिली:

user_omniauth_authorize_path(:facebook, callback_path: @custom_callback) 

मैं भी redirect_url और redirect_uri को callback_path बदलते की कोशिश की है, लेकिन कुछ भी काम करने के लिए लगता है। जब मैं जेनरेट किए गए लिंक को देखता हूं, तो इसमें वास्तव में यूआरएल में पैरामीटर के रूप में कॉलबैक शामिल होता है, लेकिन जब मैं लिंक पर क्लिक करता हूं, तो मुझे कस्टम कॉलबैक यूआरएल के बजाय डिफ़ॉल्ट कॉलबैक यूआरएल पर रीडायरेक्ट कर दिया जाता है।

+0

मुझे उस सुविधा की भी आवश्यकता है :( – diogopms

उत्तर

0

यहां बताया गया है मैं इस समस्या का समाधान। मैं यकीन है कि वहाँ अन्य तरीकों से मैं एक auth उप डोमेन की स्थापना की है, लेकिन यह सबसे सरल सबसे सुरुचिपूर्ण समाधान मैं के साथ आ सकता है की तरह लगता है।

config/routes.rb में। मेरे सभी Oauth कनेक्ट अनुरोध विभिन्न उप डोमेन पर शुरू कर देंगे और उसके बाद फेसबुक की स्थापना की है उन उपयोगकर्ताओं को वापस टी को अग्रेषित करने के लिए वह auth.example.com सबडोमेन।

constraints AuthRedirect do 
    devise_scope :contact do 
     get '/auth/facebook/callback' => 'omniauth_callbacks#facebook' 
     post '/auth/facebook/callback' => 'omniauth_callbacks#facebook' 
    end 
end 

यहां /lib/auth_redirect.rb है। यह सिर्फ जांच करता है कि सबडोमेन auth है और उस ट्रैफ़िक को कैप्चर करता है। यह मेरी मार्ग सूची के शीर्ष पर रखा गया है ताकि अन्य सबडोमेन पर प्राथमिकता प्राप्त की जा सके।

class AuthRedirect 
    def self.matches?(request) 
     request.subdomain.present? && request.subdomain == 'auth' 
    end 
end 

तो मेरे मुवक्किल, जब कोई उपयोगकर्ता Connect with Facebook बटन पर क्लिक करता है, मैं उन्हें /auth/facebook?contact_id=<id> को भेजें। यहां से डेविस उन्हें फेसबुक पर निर्देशित करता है, जो उसके बाद उन्हें https://auth.example.com/ पर रीडायरेक्ट करता है।

फिर OmniauthCallbacksController#facebook में मैं उपयोगकर्ता की आईडी omniauth पैरामीटर से तो जैसे खींच कर सकते हैं:

auth = env["omniauth.auth"] 
contact = Contact.find(env['omniauth.params']['contact_id']) 

यहाँ से मैं डेटाबेस और रीडायरेक्ट उपयोगकर्ता वापस उचित उप डोमेन में करने के लिए साख बच सकते हैं। यह समाधान सीएसआरएफ टोकन के साथ समस्याओं से बचाता है और अधिक महत्वपूर्ण रूप से मुझे रूबी/ईआरबी का उपयोग करने के लिए सर्वव्यापी प्राधिकृत पथ बनाने के लिए आवश्यकता नहीं होती है जिसे उपयोगकर्ता कनेक्ट बटन पर क्लिक करते समय भेजा जाता है।

1

क्या आपने redirect_uri के साथ प्रयास किया है?

user_omniauth_authorize_path(:facebook, redirect_uri: @custom_callback) 

संपादित करें: क्षमा करें, मैंने आपकी पोस्ट के दूसरे भाग को याद किया।

मुझे वास्तव में उत्पादन में एक ही समस्या है लेकिन यह एक स्टेजिंग वातावरण पर पूरी तरह से काम करता है। फर्क सिर्फ इतना है जो एक और उप डोमेन है मचान पर कॉलबैक यूआरएल के बारे में है * .staging.domain.com

जिस तरह से आप वसीयत प्रारंभकर्ता फ़ाइल में एक स्थिर callback_url प्रदान कर सकते हैं द्वारा:

config.oaumniauth :facebook, ..., callback_url: 'url right here' 

मैं कल इस मुद्दे पर एम। या तो मैं एक स्थिर कॉलबैक यूआरएल प्रदान लेकिन फेसबुक मुझे एक CRSF त्रुटि को जन्म देती है:

omniauth: (facebook) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected 

या मैं callback_url गतिशील सेट वसीयत जो वाला की तरह

https://*.domain.com/DEVISE_MODELS/auth/facebook 

नजर डालते हैं और इस मामले में मैं एक सीधे प्रक्रिया में एफजी लॉगजिन के दौरान गैर मिलान/श्वेतसूची वाले कॉलबैक यूआरएल।

EDIT2:

अच्छा! मैने कर दिखाया। मैं वाइल्डकार्ड सबडोमेन के साथ ओथ लॉगिन प्राप्त करने में सक्षम हूं।

  1. अपने चिंतन करना प्रारंभकर्ता
  2. में एक स्थिर callback_url प्रदान के रूप में अपने सत्र की दुकान में डोमेन जोड़ने: .domain ": डोमेन।कॉम "
इसी के साथ

मैं न CRSF त्रुटि मिल रही है और न ही सीबी यूआरएल nunmatching/श्वेत सूची में।

आशा है कि यह आपके लिए काम करेंगे!

+0

मैंने वास्तव में कुछ समय पहले हल किया और मेरा समाधान पोस्ट करना भूल गया। यह वास्तव में काफी सरल है। मैं अपने द्वारा उपयोग किए गए समाधान के साथ अपना उत्तर अपडेट करूंगा। दुर्भाग्यवश मेरे पास समय नहीं है या वर्तमान में आपके समाधान का परीक्षण करने के लिए संसाधन, लेकिन यह व्यवहार्य दिखता है इसलिए मैं इसे एक अपवर्तित दूंगा। – ACIDSTEALTH

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