Псевдоним аутентификации Facebook OmniAuth, возвращающий "profile.php? Id = .." - PullRequest
1 голос
/ 23 апреля 2011

Я использую 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"
},

1 Ответ

2 голосов
/ 24 апреля 2011

Код, извлекающий данные из фейсбука 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 - это то, что вы хотите.

...