我正在使用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
字段就是您想要的。