2011-04-23 107 views
1

我正在使用Sinatra和OmniAuth嘗試使用Facebook進行身份驗證。一切似乎都正常工作,除了暱稱屬性。我的授權哈希正在爲暱稱返回一些內容,但它不是該人的暱稱。對於我想要做的事,獲取這個人的暱稱是非常重要的。而且我已經檢查了我的Facebook頁面,以確保我有一個暱稱集,而我確實。它應該返回「HeroicEric」。OmniAuth Facebook身份驗證暱稱返回「profile.php?id = ..」

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"=>"[email protected]" 
}, 

回答

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的返回充滿

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

所以user_data,該username場是你想要的。

+1

這聽起來很不錯。 [rstat.us](http://rstat.us)發現了同樣的問題。我們現在查找包含profile.php的用戶名,並顯示用戶輸入新用戶名的HAML模板。 – 2011-05-04 16:14:32

+0

OmniAuth修復了此問題。 – HeroicEric 2011-06-11 19:55:06