你不需要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以稍微不同的方式做同样的事情。它并没有真正使用或维护,但您可能对实现感兴趣。