2014-01-13 53 views
5

我打算使用rails-api爲iOS移動應用程序提供JSON API來使用它。過程:Facebook SDK iOS連接的Rails-api身份驗證?

  1. 用戶打開移動應用程序在Facebook上
  2. 用戶點擊連接
  3. 移動應用程序得到fb_access_token並郵寄到API服務器通過識別用戶
  4. API服務器獲取用戶的個人資料在Facebook上使用fb_access_token
  5. API服務器創建並查找用戶,然後針對該特定用戶使用api_token進行響應
  6. 移動應用程序在之後的所有通信中使用api_token響應。

哪個認證應該是這個應用的最佳選擇? oAuth2或BasicAuth?我和門衛嘗試了rails-api,但它並不適用,因爲門衛需要一些資產。

回答

4

我正在做一個基本的身份驗證這與集成設計。

首先我從移動應用程序(access_token和其他東西)獲取發佈參數。

然後我用開放的API來從Facebook獲取用戶的詳細信息:

url = "https://graph.facebook.com/me?access_token=" 
    begin 
     content = open(URI.encode(url + params[:user][:access_token])) 
    rescue OpenURI::HTTPError #with this I handle if the access token is not ok 
     return render :json => {:error => "not_good_access_token" } 
    end 

現在的Facebook返回響應

status = content.status[0] 
    content = ActiveSupport::JSON.decode(content) 

    if status == "200" 
    #get the email and check if the user is already in the database. If there is not email, check by the facebook id 
    #If the user exists return the user. If the user does not exists create new 

希望這有助於

能比嗎用戶相同的代碼也爲谷歌,只需將網址更改爲「https://www.googleapis.com/oauth2/v2/userinfo?access_token=

+0

創建用戶後,如何創建API密鑰?以及如何在基本身份驗證後使用api密鑰? – Samnang

+0

我不需要API密鑰。我從移動設備上獲取access_token(我使用api密鑰和祕密獲取用戶訪問代碼)。在服務器上,我存儲從Facebook獲取的數據和下一個access_token提交的數據,我只是檢查用戶是否已經存在於數據庫中。還是你的意思是別的? –

+1

我知道客戶端的ID和祕密來訪問FB,但是從手機獲取access_token併發送到服務器後。然後服務器檢查以創建用戶或使用現有的用戶。你迴應了什麼手機?在用戶登錄之後,移動設備和服務器之間的所有通信,你是否仍然使用從手機上的Facebook獲得的access_token,或者是否使用自己的密鑰/代碼來識別用戶? – Samnang

2

我嘗試使用omniauth-facebook,因爲它使用OAuth2,使用非常簡單。所有omniauth策略都是rails中間件,因此您只需將gem 'omniauth-facebook'添加到您的gem文件中,並將以下內容添加到config/initializers/omniauth.rb,並且您將能夠使用/auth/facebook通過Facebook和/auth/facebook/callback登錄以創建用戶會話(您可能想要更改:在移動彈出窗口可能不是美觀的顯示鍵值):

Rails.application.config.middleware.use OmniAuth::Builder do 
    provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'], 
      :scope => 'email,user_birthday,read_stream', :display => 'popup' 
end 

Facebook的身份驗證令牌將在被返回到您的回調端點,它可以集成到您的移動認證的request.env['omniauth.auth'][:credentials][:token]戰略。請參閱上面的鏈接和omniauth main page瞭解更多詳情。

+1

我知道omniauth,但我覺得它更像Web客戶端應用程序。我需要弄清楚如何保護我的API的解決方案。 – Samnang

+2

實際上,它只是Rails中間件,並且在Rails-API上運行得非常好,無論api是通過桌面還是移動設備使用。看看這個回購:https://github.com/toddlee/rails-omniauth-rest-api-server – Marc