全身份验证脸书认证昵称返回"profile.php?id=.."



我正在使用Sinatra和OmniAuth,试图使用Facebook进行身份验证。一切似乎都工作正常,除了昵称属性。我的验证散列返回昵称的值,但它不是这个人的昵称。对于我想做的事情,得到这个人的昵称是非常重要的。我已经检查了我的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"
},

从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只是URL的右部分。我建议修复facebook适配器,以获得一个实际的昵称。Facebook返回user_data填充

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

那么,username字段就是您想要的。

最新更新