2013-02-11 105 views
8

我在移動應用程序的rails中創建api。現在用戶將使用Facebook登錄,我將在facebook身份驗證後接收訪​​問令牌。我必須獲取此訪問令牌並檢查訪問令牌是否存在於應用程序數據庫中。如果確實允許用戶訪問,如果沒有,則檢查電子郵件並更新訪問令牌並允許用戶訪問。使用omniauth進行facebook登錄,只使用訪問令牌

如何使用omniauth-facebook和devise完成此操作,據我所見,omniauth-facebook從零開始做所有事情,無法找到一種方法僅向omniauth-facebook提供訪問令牌。

任何有點幫助都會很棒。

回答

14

你不需要omniauth-facebook。這個寶石的目的只是爲了獲取訪問令牌(並查詢用戶的信息)。 這裏的事情是如何發生的標準設置(與設計和omniauth Facebook的):

  • Omniauth獲得它在請求的環境的訪問令牌
  • Omniauth通過通過Facebook的API和商店獲取用戶的信息
  • Omniauth調用應用程序中的一個自定義的回調方法,你需要寫
  • 這個回調方法檢索或在數據庫中創建用戶,然後使用由設計提供了幾個助手登錄用戶。

(見Devise's documentation about Omniauth瞭解詳細信息)

。現在,因爲你已經有一個訪問令牌,以及從Facebook的API獲取用戶的信息很簡單,你實際上並不需要omniauth Facebook的。

所有你需要做的是寫一個動作:

  • 獲得訪問令牌(作爲參數)
  • 獲取用戶信息(一個Graph API請求/me
  • 發現或創建數據庫用戶(使用用戶的Facebook ID)
  • 簽署用戶使用設計的助手

此代碼基於Devise's documentation中給出的示例。

class Users::FacebookCallbacksController 
    def facebook 
    # You should test if params[:access_token] is present 
    # and if this request fails 
    facebook_data = HTTParty.get("https://graph.facebook.com/me", query: { 
     access_token: params[:access_token] 
    }).parsed_response 

    # You need to implement the method below in your model (e.g. app/models/user.rb) 
    @user = User.find_for_facebook_oauth(facebook_data) 

    if @user.persisted? 
     sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
     set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format? 
    else 
     session["devise.facebook_data"] = facebook_data 
     redirect_to new_user_registration_url 
    end 
    end 
end 

注:

  • 我使用這裏的HTTParty gem調用Facebook的API,但也有其他的可能性,包括Koala
  • sign_in_and_redirectset_flash_messageis_navigational_format?的助手通過設計提供
  • 請參考Devise's documentation實施User.find_for_facebook_oauth
  • 稱爲devise_facebook_open_graph的寶石以稍微不同的方式做同樣的事情。它沒有被真正使用或維護,但您可能會對實施感興趣。