OmniAuth Facebook身份验证昵称返回“profile.php?id = ..”

时间:2011-04-23 18:14:24

标签: ruby facebook authentication sinatra omniauth

我正在使用Sinatra和OmniAuth,尝试使用Facebook进行身份验证。除了昵称属性外,一切似乎都正常工作。我的auth哈希为昵称返回了一些东西,但它不是该人的昵称。对于我想要做的事情,获得​​这个人的昵称非常重要。我已经检查了我的Facebook页面,以确保我有一个昵称设置,我做。它应该返回“HeroicEric”。

get '/auth/:name/callback' do
  auth = request.env["omniauth.auth"]
  user = User.first_or_create({ :uid => auth["uid"]}, { 
    :uid => auth["uid"], 
    :username => auth["user_info"]["nickname"],
    :name => auth["user_info"]["name"],
    :email => auth["user_info"]["email"]
  })

  session[:user_id] = user.id
  redirect '/user/' + user.id.to_s
end

正在返回的哈希如下所示:

"user_info"=>{
  "name"=>"Eric Kelly", 
  "urls"=>
    {
      "Facebook"=>"http://www.facebook.com/profile.php?id=550432081", 
      "Website"=>nil
    }, 
  "nickname"=>"profile.php?id=550432081", 
  "last_name"=>"Kelly", 
  "image"=>"http://graph.facebook.com/550432081/picture?type=square", 
  "first_name"=>"Eric", 
  "email"=>"heroiceric@gmail.com"
},

1 个答案:

答案 0 :(得分:2)

从Facebook OAuth回答中提取数据的代码位于oa-oauth-0.2.3/lib/omniauth/strategies/facebook.rb

  def user_info
    {
      'nickname' => user_data["link"].split('/').last,
      'email' => (user_data["email"] if user_data["email"]),
      'first_name' => user_data["first_name"],
      'last_name' => user_data["last_name"],
      'name' => "#{user_data['first_name']} #{user_data['last_name']}",
      'image' => "http://graph.facebook.com/#{user_data['id']}/picture?type=square",
      'urls' => {
        'Facebook' => user_data["link"],
        'Website' => user_data["website"],
      }
    }
  end

如您所见,nickname只是网址的一部分。我建议修复facebook适配器以获得实际的昵称。 Facebook返回user_data填充

{ ... "name"=>"John", "first_name"=>"John", "last_name"=>"Smith",
"link"=>"http://www.facebook.com/ujifgc", "username"=>"ujifgc", ... }

所以,username字段就是你想要的。

相关问题