Проблемы с OAuth 2 Gem

У меня есть проект rails, использующий https://github.com/intridea/oauth2. В моем приложении rails у меня есть следующий код:

ApplicationController.rb

def facebook_client
  OAuth2::Client.new(FacebookOauthCredentials::APP_ID, FacebookOauthCredentials::APP_SECRET, :site => 'https://graph.facebook.com')
end

FacebookController.rb

def facebook_session_create(poster, featured_item)
  redirect_to facebook_client.web_server.authorize_url(:scope => 'publish_stream', :redirect_uri => "http://localhost:3000/facebook/facebook_callback")
end

def facebook_callback

  if(params[:code])
    begin
      access_token = facebook_client.web_server.get_access_token(params[:code], :redirect_uri => "http://localhost:3000/facebook/facebook_callback")

      access_token.post('/me/feed', "testing #{rand(1000)}")
    rescue OAuth2::HTTPError => e
      render :text => e.response.body
    end
  end
end

Каждый раз, когда я запускаю этот код, я получаю этот ответ:

{"error":{"type":"OAuthException","message":"Error validating verification code."}}

Тем не менее, я использую приложение sinatra, указанное в файле readme гема OAuth2, оно работает нормально.

def client
  OAuth2::Client.new(FacebookOauthCredentials::APP_ID, FacebookOauthCredentials::APP_SECRET, :site => 'https://graph.facebook.com')
end

get '/auth/facebook' do
   redirect client.web_server.authorize_url(
    :redirect_uri => redirect_uri,
    :scope => 'publish_stream'
  )
end

get '/auth/facebook/callback' do
  access_token = client.web_server.get_access_token(params[:code], :redirect_uri =>   redirect_uri)

  begin
    user = JSON.parse(access_token.post('/me/feed', :message => "testing # {rand(10000)}"))
  rescue Exception => e
    return e.response.body
  end

  user.inspect
end

def redirect_uri
  uri = URI.parse(request.url)
  uri.path = '/auth/facebook/callback'
  uri.query = nil
  uri.to_s
end

Я попытался воспроизвести шаги с помощью irb, но получил ошибку http 400. Я не уверен, что это по той же причине, что и приложение rails, или потому, что я использую гибрид консоли и веб-браузера. Любые предложения будут ценны.


person Mike    schedule 27.01.2011    source источник
comment
Вы хорошо настроили свое приложение facebook с действительным URL-адресом обратного вызова, и вы используете этот URL-адрес обратного вызова?   -  person shingara    schedule 27.01.2011
comment
URL-адрес обратного вызова, настроенный в Facebook, — localhost, а домен обратного вызова настроен как localhost.   -  person Mike    schedule 27.01.2011


Ответы (2)


Я нашел ответ на свою проблему на этой странице API графа Facebook — токен OAuth

Я столкнулся с точно такой же проблемой, но оказалось, что проблема не в кодировке параметра redirect_uri или в том, что у меня была косая черта или вопросительный знак в конце, а просто в том, что я передал два разных URL-адреса перенаправления (не читал спецификацию на тот момент время).

redirect_uri используется как перенаправление только один раз (в первый раз), чтобы перенаправить обратно проверяющей стороне с токеном «код». Во второй раз redirect_uri передается обратно на сервер аутентификации, но на этот раз он используется не так, как вы ожидаете (для перенаправления), а используется сервером аутентификации для проверки кода. Сервер отвечает access_token.

Вы заметите, что документация facebook (что ужасно) говорит fetch «Обменяйте его на токен доступа, выбрав….»

Таким образом, мне не пришлось кодировать или делать что-то особенное с Uri, просто дважды введите один и тот же redirect_uri и получите вторую страницу, чтобы получить внутри access_token.

Я неправильно скопировал исходный код, и uri перенаправления, который я передал для получения кода, отличался от uri, который я передал для получения токена доступа. Документация API Facebook ужасна :(

person Mike    schedule 27.01.2011

У меня была эта проблема/ошибка, но, наконец, я нашел другое решение (путем сравнения моих рабочих настроек приложения Dev) с настройками моего рабочего приложения (которое генерировало эту ошибку).

Я перешел на страницу дополнительных настроек своего приложения в приложении Facebook Developer: https://developers.facebook.com/apps/YourAppID/advanced

Затем я нашел параметр «Зашифрованный токен доступа:» и включил его.

person innonate    schedule 07.02.2012