我正在使用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"
},
答案 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
字段就是你想要的。