6

我们的 Rails 3 应用程序使用 facebook-omniauth,允许用户通过 facebook 进行身份验证。

尽可能多地使用基于 Web 的身份验证系统会很好,所以我尝试按照这个 SO 问题的答案(没有被否决的那个),但我无法让它工作。

答案的要点是:

omn​​iauth-facebook 将使用 access_token 参数毫无问题地处理对回调端点的请求。简单的 :)

因此,为了测试这一点,在我的浏览器中,我发出以下请求:

/users/auth/facebook_api/callback?access_token=BAAB...

但在我的服务器日志中,我看到:

(facebook) Callback phase initiated.
(facebook) Authentication failure! invalid_credentials: OAuth2::Error, : 
{"error":{"message":"Missing authorization code","type":"OAuthException","code":1}}

我无法弄清楚我做错了什么。事实上,我试图通过浏览器来测试搞砸了一些事情吗?关于如何为我的 ios 应用程序重用基于 www 的身份验证逻辑的任何其他想法?

更新: 我不确定,但我遵循本指南是为了拥有多种 facebook omniauth 策略,一种用于 www,另一种用于移动设备。

4

1 回答 1

7

我从来没有找到符合我最初要求的解决方案,但我是这样解决的:获取您在 iPhone 上获得的访问令牌并将其发送到您的服务器并手动执行登录。

def facebook_login
  graph = Koala::Facebook::API.new(params[:user][:fb_access_token])
  profile = graph.get_object('me')
  omniauth = build_omniauth_hash(profile)

  @user = User.find_or_create_for_facebook_oauth(omniauth)
end

在 www 上,我们已经有一个名为 的方法find_or_create_for_facebook_oauth,它从 Omniauth 获取结果,要么找到用户,要么创建一个新用户。为了将这种方法用于移动设备,我必须手动构建一个类似的结构,以便可以将其作为参数传递。

def build_omniauth_hash(profile)
  struct = OpenStruct.new
  struct.uid = profile['id']
  struct.info = OpenStruct.new
  struct.info.email = profile['email']
  struct.info.image = "http://graph.facebook.com/#{profile['id']}/picture?type=square"
  struct.info.first_name = profile['first_name']
  struct.info.last_name = profile['last_name']
  struct.info.bio = profile['bio']
  struct.info.hometown = profile['hometown']['name'] if profile['hometown']
  struct.info.location = profile['location']['name'] if profile['location']
  struct
end
于 2013-01-16T00:00:26.600 回答