هل توفر Omniauth خطافات بسيطة لواجهة برمجة تطبيقات Facebook Graph؟
-
25-09-2019 - |
سؤال
أنا أعمل على دمج Omniauth مع تطبيق Facebook الجديد الخاص بي ، وأنا أبحث عن الوثائق المتفرقة إلى حد ما لفهم ما إذا كان يعطي طرقًا بسيطة للوصول إلى واجهة برمجة تطبيقات الرسم البياني ... أنتقل من Koala الذي كان بسيطًا جدًا.
هل استخدم أي شخص هناك Omniauth لهذا حتى الآن؟ أرغب في الحصول على صور من ألبومات المستخدمين ، والفرز والحصول على عناوين URL الفريدة لهم.
المحلول 4
لذلك لم أتمكن من الحصول على FB_Graph للعمل بشكل صحيح - ما زلت NOOB بعد أن كنت مطور Ruby on Rails ما مجموعه حوالي 8-10 أسابيع ، وبالتالي ليس لدي غريزة لما يجب أن يكون مشاكل واضحة ل الناس الآخرين.
ومع ذلك ، فقد وجدت منشور المدونة الصغير الرائع الذي يحدد عميلًا بسيطًا على Facebook ويظهر بوضوح كيف يتم سداد كل شيء معًا. لقد وجدت مشكلة معها في التقاط كائن ME/Picture حيث يقوم Facebook بإرجاع HTTP302 وليس HTTP200 ولكن تم العمل بسهولة بمساعدة المؤلف. تحقق من ذلك: http://bnerd.de/misc/ruby-write-basic-client-for-facebook-graph-api/
أنا الآن أستخدم omniauth لبساطة تفاعل تسجيل الدخول/التسجيل استنادًا إلى هذا التجول هنا: blog.railsrumble.com/blog/2010/08/intridea-omniauth ومع الرمز المميز الذي أحصل عليه من هذا الأمر البسيط FBClient من مرجع Bnerd أعلاه للوصول إلى API الرسم البياني. أتمنى أن يساعد ما وجدته الآخرين.
... إليك نسختي من رمز Bnerd وقد عملت بالنسبة لي:
class FBClient
def initialize(app, access_token = nil)
@app = app
@access_token = access_token
end
# request permission(s) from user
def request(perms)
#create a random verifier to identify user on fb callback
verifier = (0...10).map{65.+(rand(25)).chr}.join
uri = "https://graph.facebook.com/oauth/authorize?client_id=#{@app.app_id}&redirect_uri=#{@app.connect_url}?verifier=#{verifier}&scope=#{perms}"
request = { :verifier => verifier, :uri => uri }
return request
end
def connect(code, verifier)
uri = URI.parse("https://graph.facebook.com/oauth/access_token?client_id=#{@app.app_id}&redirect_uri=#{@app.connect_url}?verifier=#{verifier}&client_secret=#{@app.secret}&code=#{CGI::escape(code)}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri.path + "?" + uri.query)
response = http.request(request)
data = response.body
return data.split("=")[1]
end
# get, post
def get(path, params = nil)
uri = URI.parse("https://graph.facebook.com/" + path)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
if params.nil?
params = Hash.new
end
if params["access_token"].nil?
params["access_token"] = @access_token unless @access_token.nil?
end
request = Net::HTTP::Get.new(uri.path)
request.set_form_data( params )
request = Net::HTTP::Get.new(uri.path + "?" + request.body)
return response = http.request(request)
end
def post(path, params = nil)
uri = URI.parse("https://graph.facebook.com/" + path)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
if params.nil?
params = Hash.new
end
if params[:access_token].nil?
params[:access_token] = @access_token unless @access_token.nil?
end
request = Net::HTTP::Post.new(uri.path)
request.set_form_data( params )
request = Net::HTTP::Post.new(uri.path + "?" + request.body)
response = http.request(request)
response.code == "200" ? feed = JSON.parse(response.body) : raise("Sorry, an error occured. #{response.body}")
return feed
end
end
أنا متأكد من أن شخصًا أكثر خبرة مما يمكنني تحسينه - كنت على بعد حوالي 10 أسابيع من تعلم روبي (وأول برمجة منذ فورتران وباسكال في الجامعة في أوائل التسعينيات!).
نصائح أخرى
اكتشفت أخيرًا:
1) تشمل هذه الأحجار الكريمة
2) استخدم الجوهرة:
user = FbGraph::User.new('me', :access_token => session[:omniauth]["credentials"]["token"])
user.fetch
3) استرداد معلوماتكuser.name
تذكر أنه يمكنك الحصول على أي شيء من هنا ttp: //developers.facebook.com/docs/reference/api/user
خيار جيد آخر هو كوالا: https://github.com/arsduo/koala
إذا كنت تستخدم Facebook فقط ، فإن Koala لديها دعم Oauth الخاص بها. كما أنه يعمل بشكل جيد مع omniauth. لاستخدامها معًا ، قم بإعداد Omniauth لكل هذه القضبان:http://railscasts.com/episodes/235-omniauth-bart-1
ثم أضف عمود "رمز" إلى جدول "المصادقة" ، وأي طرق داعمة لاسترداد الرموز. عندما يحتاج التطبيق إلى التفاعل مع Facebook ، دع Koala الاستيلاء على الرمز المميز والقيام بعمله. في وحدة التحكم:
if @token = current_user.facebook_token
@graph = Koala::Facebook::GraphAPI.new(@token)
@friends = @graph.get_connections("me", "friends")
end
أولاً ، سأذهب إلى FB_Graph ، فقط قارن:
مع كوالا:
graph = Koala::Facebook::GraphAPI.new OAUTH_ACCESS_TOKEN
friends = graph.get_connections("me", "friends")
graph.put_object("me", "feed", :message => "I am writing on my wall!")
مع fb_graph:
me = FbGraph::User.me OAUTH_ACCESS_TOKEN
my_friends = me.friends
me.feed! :message => "I am writing on my wall!"
عند استخدام omniauth, ، كل مستخدم لديه العديد من التراخيص (Facebook ، Twitter ، ...)
لكل إذن من المستخدم ، يجب عليك تخزين OAUTH رمز يتم إرجاع ذلك في تجزئة رد الاتصال OAUTH الخاص بك.
auth = Authorization.create!(:user => user,
:uid => hash['uid'],
:provider => hash['provider'],
:token => hash['credentials']['token'])
ثم أينما تريد الوصول إلى الألبومات والصور ، افعل شيئًا كهذا:
class User
...
has_many :authorizations
...
def grap_facebook_albums
facebook = authorizations.where(:provider => :facebook).first
fb_user = ::FbGraph::User.fetch facebook.uid, :access_token => facebook.token
fb_albums = fb_user.albums
end
...
end
واجهت أيضًا مشاكل في الحصول على حل Oper+Omniauth للعمل. اضطررت إلى المشاكل:
- لم يخزن ملف تعريف ارتباط الجلسة رمز مصادقة Facebook الضروري لتهيئة FB_Graph و Koala.
- لم أتمكن من تهيئة FB_Graph بعد الحصول على رمز مصادقة Facebook في مكانه (لكنني حصلت على Koala للعمل بعد بعض العمل).
لقد قمت بحل #1 عن طريق إدراج "الجلسة [: omniauth] = omniauth" في طريقة إنشاء antaintications_controller.rb.
لقد حللت #2 باستخدام كوالا. يبدو أن fb_graph يتطلب OAUTH2 ، واستخدام تكامل omniauth inport. تعمل Koala تمامًا مع رمز مصادقة Facebook المخزّن بواسطة الجلسة [: Omniauth] ["بيانات الاعتماد"] ["Token"].
تقوم بتهيئة كوالا مثل هذا:
- fbprofile = koala :: facebook :: graphapi.new (الجلسة [: omniauth] ["بيانات الاعتماد"] ["رمز"])
لقد تأكدت من إلغاء تثبيت Oauth و OAuth2 ، ثم قمت بتثبيت OAUTH2. يبدو أن Omniauth و FB_Graph يعملان الآن ... ولكن ربما تحتاج إلى اختبار أكثر.