8

我正在为移动应用程序在 Rails 中创建一个 api。现在用户将使用 facebook 登录,我将在 facebook 身份验证后收到访问令牌。我必须获取此访问令牌并检查应用程序数据库中是否存在访问令牌。如果允许则允许用户访问,如果不允许则检查电子邮件并更新访问令牌并允许用户访问。

我如何使用omniauth-facebook 和devise 来实现这一点,据我所知omniauth-facebook 从头开始​​做所有事情,找不到只提供对omniauth-facebook 的访问令牌的方法。

任何帮助都会很棒。

4

1 回答 1

18

你不需要omniauth-facebook。此 gem 的目的只是获取访问令牌(并查询用户信息)。以下是标准设置中发生的事情(使用 Devise 和omniauth-facebook):

  • Omniauth 获得访问令牌
  • Omniauth 通过 Facebook 的 API 获取用户信息并将其存储在请求的环境中
  • Omniauth 在您需要编写的应用程序中调用自定义回调方法
  • 这个回调方法在数据库中检索或创建用户,然后使用 Devise 提供的一些帮助器来登录用户。

(有关更多详细信息,请参阅Devise 关于 Omniauth 的文档

现在,鉴于您已经拥有访问令牌,并且从 Facebook 的 API 获取用户信息非常简单,您实际上并不需要omniauth-facebook。

您需要做的就是编写一个动作来:

  • 接收访问令牌(作为参数)
  • 获取用户信息(对/me的 Graph API 请求)
  • 在数据库中查找或创建用户(使用用户的 Facebook id)
  • 使用 Devise 的助手让用户登录

此代码基于Devise 文档中给出的示例。

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_redirect,set_flash_message并且is_navigational_format?是 Devise 提供的助手
  • 请参阅设计的文档以实现User.find_for_facebook_oauth
  • 一个名为devise_facebook_open_graph的 gem以稍微不同的方式做同样的事情。它并没有真正使用或维护,但您可能对实现感兴趣。
于 2014-06-02T18:03:54.367 回答