Rails omniauth-facebook нерешенная проблема

В текущей версии omniauth-facebook есть некоторые проблемы, и я хочу знать, есть ли у кого-нибудь ответы на них.

Первой проблемой была проблема недопустимых учетных данных. Из-за этой проблемы я не смог войти в мое приложение, используя авторизацию на стороне клиента. Однако это можно решить, понизив версию facebook-omniauth до версии 1.4.0. (ссылка)

Однако теперь я столкнулся со второй проблемой, NoAuthorizationCodeError, с сообщением об ошибке:

OmniAuth Strategies Facebook NoAuthorizationCodeError 
(must pass either a `code` parameter or a signed request 
(via `signed_request` parameter):

это было задано в здесь, но принятый ответ снова советует на самом деле обновить до версии 1.4.1, что сделает предыдущий проблема с неверными учетными данными возникает снова. Так что это не вариант для меня.

NoAuthorizationCodeError происходит, когда я пытаюсь войти в мое приложение внутри iFrame Facebook (искал мое приложение из центра приложения) через Internet explorer. Все работает отлично на хром или firefox. Там также github issue точно определяет эту проблему, но пока никто не получил ответа. Я также попытался перейти на версию omniauth-facebook 1.3.0, но это не имело значения. Я также попытался передать параметр signed_request следующим образом:

window.location = '/auth/facebook/callback', 
{ signed_request: response.authResponse.signedRequest }

Однако это не имело никакого значения (в IE ошибка все еще сохраняется), и я не уверен, что это правильный способ передать код в качестве параметра (как я могу проверить?)

Я предполагаю, что никаких проблем с моими настройками не возникает. Я бы очень признателен за любую помощь в этом вопросе.

UPDATE:

Я обновил до версии 1.4.1 без проблем с недопустимыми учетными данными, но NoAuthorizationCodeError все еще возникает, когда я обращаюсь к приложению внутри Facebook через Internet Explorer. Проверьте мой Github issue.

UPDATE:

Я понизил рейтинг до версии 1.4.0 и добавил параметры signedRequest.

<script>
function login() {
  FB.login(function(response) {
    if (response.authResponse) {
      window.location = '/auth/facebook/callback?' + $.param({ signed_request: response.authResponse.signedRequest })
    } 
  }, {scope: 'email,publish_stream,publish_actions'});
}
</script>

В журнале нет ошибок или предупреждений, и все работает так, как ожидалось. Однако, если я запишусь в Facebook iFrame через Internet Explorer, он не войдет в систему даже после того, как будет инициирована фаза обратного вызова. Я предполагаю, что исходная проблема была решена, но я не могу понять, как отлаживать ее, когда нет какого-либо сообщения об ошибке.

Проблема. Когда я нажимаю "войти в систему с Facebook" внутри Facebook iFrame для моего приложения в Internet Explorer, я НЕ вошел в систему, когда процесс авторизации завершен. Эта проблема возникает только в этой конкретной среде, и мне было трудно найти, почему.

2013-02-22T01:10:40+00:00 app[web.1]: Started GET "/auth/facebook/callback?signed_request=LONGSTRING" for 200.1.102.103 at 2013-02-22 01:10:40 +0000
2013-02-22T01:10:40+00:00 app[web.1]: (facebook) Callback phase initiated.
2013-02-22T01:10:40+00:00 app[web.1]: Processing by SessionsController#create_facebook as HTML
2013-02-22T01:10:40+00:00 app[web.1]:   Parameters: {"signed_request"=>"LONGSTRING", "provider"=>"facebook"}
2013-02-22T01:10:40+00:00 app[web.1]:   User Load (1.6ms)  SELECT "users".* FROM "users" WHERE "users"."provider" = 'facebook' AND "users"."uid" = 'MYUID' LIMIT 1
2013-02-22T01:10:40+00:00 app[web.1]:    (0.8ms)  BEGIN
2013-02-22T01:10:40+00:00 app[web.1]:   User Exists (1.0ms)  SELECT 1 AS one FROM "users" WHERE ("users"."name" = 'MYNAME' AND "users"."id" != 3) LIMIT 1
2013-02-22T01:10:40+00:00 app[web.1]:    (0.9ms)  COMMIT
2013-02-22T01:10:40+00:00 app[web.1]: Redirected to http://MYAPP.COM
2013-02-22T01:10:40+00:00 app[web.1]: Completed 302 Found in 10ms (ActiveRecord: 4.2ms)

Опять же, в любой другой среде авторизация отлично работает во всех браузерах. Эта проблема возникает только при попытке войти в Facebook через Internet Explorer.

Моя окружающая среда: omniauth-facebook 1.4.0, omniauth 1.1.1, oauth2 0.8.0, Rails 3.2.11

Я намеренно понизил omniauth-facebook с 1.4.1 до 1.4.0 из-за ошибки недопустимых учетных данных в последней версии.

Ответ 1

используют omniauth (1.1.3), oauth2 (0.8.1) и omniauth-facebook (1.4.1).

Вы не получите никаких ошибок с этими

Ответ 2

fastcatch указан в this SO post с помощью getting-more-information-from-omniauth-exceptions, который говорит,

... OmniAuth strategies [...], if they encounter a problem, call the method fail! and pass in a symbol describing the problem like :invalid_credentials and the exception they encountered. The fail! method ends up calling OmniAuth.config.on_failure and passing in the Rack environment (after doing a few other things like sticking the exception into the environment...

Ответ 3

Поскольку вы видите проблему только в Internet Explorer при использовании iframe, это может быть проблема P3P.

См. http://www.slideshare.net/cmercier/things-i-learned-writing-a-facebook-canvas-app и Cookie заблокирована/не сохранена в IFRAME в Internet Explorer:

Internet Explorer обеспечивает более низкий уровень доверия к страницам IFRAME (IE вызывает это "стороннее" содержимое). Если на странице внутри IFRAME нет Политики конфиденциальности, ее файлы cookie блокируются (что указано значком глаза в строке состояния, когда вы нажимаете на нее, он показывает список заблокированных URL-адресов). ... В этом случае, когда файлы cookie заблокированы, идентификатор сеанса не отправляется, а целевой script выдает ошибку "session not found".

Попробуйте добавить rack-p3p gem и посмотреть, помогает ли он!