2011-08-29 19 views
7

के रूप में एक वैकल्पिक omniauth टोकन के साथ तैयार करने में http प्रमाणीकरण का उपयोग कैसे करें हमारे पास एक रेल ऐप सेटअप है जो & omniauth का उपयोग करता है ताकि फेसबुक प्रमाणीकरण के माध्यम से लॉग इन करने की अनुमति मिल सके। हमारे पास एक मोबाइल ऐप भी है जो वर्तमान में उपयोगकर्ता नाम & पासवर्ड पास करके या http प्रमाणीकरण टोकन में गुजरकर रेल ऐप में लॉगिन करने के लिए http प्रमाणीकरण का उपयोग कर रहा है। यह सब अब तक बहुत अच्छा काम करता है।प्रमाणीकरण टोकन

मोबाइल ऐप में फेसबुक के साथ प्रमाणीकरण करने की क्षमता भी है और उपयोगकर्ता फेसबुक टोकन को सीधे और फेसबुक के बीच प्राप्त करने की क्षमता है।

मैं इस अंतर को पुल करना चाहता हूं ताकि यदि उपयोगकर्ता फेसबुक के माध्यम से मोबाइल ऐप से लॉग इन कर लेता है और उसका फेसबुक टोकन है, तो उस फेसबुक टोकन को रेल ऐप पर प्रमाणीकरण के रूप में इस्तेमाल करने की अनुमति दें जैसे कि उन्हें प्राप्त हुआ था यह ब्राउज़र से ब्राउज़र के माध्यम से।

अंतिम परिणाम होगा मोबाइल एप्लिकेशन में एक उपयोगकर्ता लॉग ऑन कर सकते कि के माध्यम से:

1) उपयोगकर्ता नाम/पासवर्ड या 2) http प्रमाणीकरण टोकन या 3) omniauth (फेसबुक) टोकन

इसके अलावा, 3 के मामले में), यदि उपयोगकर्ता अभी तक रेल ऐप पर मौजूद नहीं है, तो उपयोगकर्ता को यह बनाने की आवश्यकता होगी - अब ब्राउज़र ब्राउज़र प्रमाणीकरण के साथ पहले से ही ऐसा करने के लिए कुछ भी नहीं हो सकता है।

मैं इसे डिज़ाइन निर्माण के भीतर कैसे पूरा कर सकता हूं?

उत्तर

10

बस यह किया, लेकिन कभी-कभी अंत तक समाधान नहीं देखा।

यह पता बिंदु 3. 1 & 2 आसानी से तैयार और दस्तावेज के साथ कहीं और पूरा कर रहे हैं।

अपने वेब ऐप में एफबी ऑथ जोड़ने के लिए बहुत मुश्किल नहीं है, निर्देश omniauth और omniauth-facebook के लिए github पर हैं।

मेरा मानना ​​है कि निम्नलिखित अकेले खड़े हैं, omniauth-facebook एकीकरण किए बिना, यदि आप इसे ऐसा करना चाहते हैं। यह वहां के अन्य दृष्टिकोणों के समान है। मेरा विचार था कि मैं जितना संभव हो उतना करीबी मॉडल का उपयोग करने का प्रयास करना चाहता था।

आपको fb_graph मणि ​​की आवश्यकता होगी।

मोबाइल क्लाइंट पर, आप उचित रूप से एफबी के साथ प्रमाणित करते हैं और अपने http अनुरोधों के शीर्षलेख में लौटाई गई पहुंच टोकन डालते हैं। मैंने हेडर fb_access_token का उपयोग किया। मूल लेख की तरह, आप इसे टोकन के स्नीफिंग से बचने के लिए एसएसएल पर भेजना चाहेंगे। हेडर का उपयोग करके मुझे अनुरोधों को बदले बिना बुनियादी लेख और एफबी ऑथ का आदान-प्रदान करने की अनुमति मिलती है, लेकिन यदि आप चाहें तो पैरामीटर का उपयोग कर सकते हैं।

यह समाधान एक वार्डन रणनीति लागू करता है जो कि प्रामाणिक प्रमाणीकरण योग्य वार्डन रणनीति के आधार पर आधारित है। यहां अंतर यह तथ्य है कि यह रणनीति fb_access_token नामक एक HTTP शीर्षलेख का उपयोग करती है जिसमें फेसबुक एक्सेस टोकन स्ट्रिंग है जिसे मोबाइल एप्लिकेशन का उपयोग करके पुनर्प्राप्त किया गया था।

एक बार जब आप इसे जानते हैं, तो कोड बहुत सरल है।

फ़ाइल में, कॉन्फ़िगर/प्रारंभकर्ता निर्देशिका में, निम्न जोड़ें। मैं अपनी fb_api_strategy कॉल करने के लिए हुआ था।rb:

# authentication strategy to support API authentication over the webservice 
# via facebook 

require 'devise/strategies/database_authenticatable' 
require 'fb_graph' 
require 'warden' 

module Devise 
    module Strategies 
    class FbMobileDatabaseAuthenticatable < Authenticatable 
    def valid? 
    # if we have headers with the facebook access key 
    !!request.headers["fb_access_token"] 
    end 

    def authenticate! 
    token = request.headers["fb_access_token"] 
    fbuser = FbGraph::User.me(token) 
    fbuser = fbuser.fetch 

    user = User.find_for_facebook_mobile_client(fbuser.email) 

    # this either creates a new user for the valid FB account, or attaches 
    # this session to an existing user that has the same email as the FB account 

    if !!user && validate(user) { true } 
     user.after_database_authentication 
     success!(user) 
    elsif !halted? || !user 
     fail(:invalid) 
     end 
     end 
    end 
    end 
end 

Warden::Strategies.add(:fb_database_authenticatable, 
         Devise::Strategies::FbMobileDatabaseAuthenticatable) 

config/initializers में, जोड़ने devise.rb के लिए निम्न:

config.warden do |manager| 
    manager.default_strategies(:scope => :user).unshift :fb_database_authenticatable 
    end 

आप या तो एक उपयोगकर्ता अमेरिकन प्लान ईमेल के आधार पर किसी मौजूदा उपयोगकर्ता बनाने या खोजने के लिए अनुमति देने के लिए, जोड़ने अपने उपयोगकर्ता मॉडल के लिए निम्न:

def self.find_for_facebook_mobile_client(fb_email) 
    if user = User.where(:email => fb_email).first 
     user 
    else 
     User.create!(:email => fb_email, :password => Devise.friendly_token[0,20]) 
    end 
    end 

मुझे नहीं लगता कि fb_database_authenticatable एक सटीक नाम है, लेकिन मैं पाठक के लिए एक व्यायाम के रूप कि छोड़ देंगे। एक अन्य अभ्यास एफबी एक्सेस टोकन को कैशिंग/स्टोर कर रहा है, और शायद प्रत्येक कॉल के साथ आरटी को आरबी से परहेज कर रहा है। आपको ध्यान रखना चाहिए कि मोबाइल ऐप और रेल ऐप से एक्सेस टोकन अलग-अलग होगा यदि आप दोनों तरफ एफबी प्रमाणीकरण करते हैं, जो मुझे संदेह है कि ज्यादातर लोग ऐसा करना चाहते हैं। यह शायद आपकी कैशिंग योजना को प्रभावित करता है।

मुझे लगता है कि यह करता है - खुश कोडिंग।

+2

कुछ नोट करने के लिए: मूलभूत अनुमतियां एक अमेरिकन प्लान खाते का उपयोग कर के लिए ईमेल पता प्रदान न करें। इस अनुमति के लिए आपको स्पष्ट रूप से उपयोगकर्ता से पूछना होगा। – beeudoublez

+0

अच्छा बिंदु @beudoublez, यह वही है जो मैंने अपने ऐप में किया था। – Matt

0

आप xcode 4.3.2 में अनुरोध हेडर सेट कर रहे हैं आप इस्तेमाल कर सकते हैं:

[request setValue:@"12345" forHTTPHeaderField:@"fbaccesstoken"]; 

लेकिन आप का उपयोग नहीं कर सकते हैं:

[request setValue:@"12345" forHTTPHeaderField:@"fb_access_token"]; // does NOT get set 
संबंधित मुद्दे