बस यह किया, लेकिन कभी-कभी अंत तक समाधान नहीं देखा।
यह पता बिंदु 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 एक सटीक नाम है, लेकिन मैं पाठक के लिए एक व्यायाम के रूप कि छोड़ देंगे। एक अन्य अभ्यास एफबी एक्सेस टोकन को कैशिंग/स्टोर कर रहा है, और शायद प्रत्येक कॉल के साथ आरटी को आरबी से परहेज कर रहा है। आपको ध्यान रखना चाहिए कि मोबाइल ऐप और रेल ऐप से एक्सेस टोकन अलग-अलग होगा यदि आप दोनों तरफ एफबी प्रमाणीकरण करते हैं, जो मुझे संदेह है कि ज्यादातर लोग ऐसा करना चाहते हैं। यह शायद आपकी कैशिंग योजना को प्रभावित करता है।
मुझे लगता है कि यह करता है - खुश कोडिंग।
कुछ नोट करने के लिए: मूलभूत अनुमतियां एक अमेरिकन प्लान खाते का उपयोग कर के लिए ईमेल पता प्रदान न करें। इस अनुमति के लिए आपको स्पष्ट रूप से उपयोगकर्ता से पूछना होगा। – beeudoublez
अच्छा बिंदु @beudoublez, यह वही है जो मैंने अपने ऐप में किया था। – Matt