Facebook редирект после авторизации

Я прочитал ряд вопросов и ответов, в том числе этот в StackOverflow, и ни один из них не работает. Мой вопрос ко всем ответам, которые я видел, звучит так: «Это работает в Safari?».

Я пытаюсь заставить это работать с Safari. Он отлично работает в Chrome и Firefox. Но в Safari экран входа в систему просто зависает, и я получаю сообщение журнала «Небезопасная попытка JavaScript получить доступ к фрейму с URL-адресом».

У меня есть приложение для холста. Я хочу войти в систему и перенаправить их на страницу после входа в систему. Я пытаюсь перенаправить сразу после входа в систему. я пытался

  1. установка window.top.location на URL-адрес facebook (с некоторыми данными, переданными в подписанный запрос в качестве аргумента all_data)

  2. установка window.location на URL-адрес с тем же доменом, что и мое приложение.

  3. подписываемся на событие auth.login и ставим туда редирект

  4. поместить перенаправление в обратный вызов для входа в систему

Ни один из них не работает для Safari. Я начинаю думать, что нет никакого способа сделать это.

function doSomething()
{
  FB.login(
    function(loginResponse)
    {
      if (loginResponse.authResponse)
      {
        window.top.location = "my url"
      }
    },
    {
      scope:"some,scope"
    }
  );
}
}

В ответ Ницану Томеру, вот эквивалентный код, который не работает с Safari, но работает с другими:

function myThing()
{
  FB.login(function(loginResponse)
    {
      if (loginResponse.authResponse)
      {
        FB.api('/me', function(response)
        { 
          window.location = "http://my_app.com?x=" + response.xyz;
        });
        }
    },
    {
      scope:"scopes"
    }
  );
}

person Joe    schedule 22.05.2012    source источник


Ответы (2)


Это не совсем решение вашей проблемы, а скорее «обходной путь», хотя он по-прежнему использует window.top.location, но не из обратного вызова, поэтому, возможно, он сработает (я просто не уверен, где выполняется обратный вызов, так как это fb sdk, который его выполняет, возможно, они вызывают его из fb iframe внутри вашего iframe).

Вместо аутентификации на стороне клиента вы можете использовать процесс на стороне сервера. Весь процесс происходит в верхнем окне, поскольку он начинается с того, что вы перенаправляете пользователя в диалоговое окно oauth с помощью window.top.location.

Когда процесс заканчивается, facebook перенаправляет пользователя на ваш redirect_uri, и там вы можете просто перенаправить пользователя, куда хотите.

Я надеюсь, это поможет. Кроме того, вы должны знать, что в Политиках платформы Facebook говорится:

13 . Основная цель вашего приложения Canvas или Page Tab на Facebook не должна состоять в том, чтобы просто перенаправлять пользователей из Facebook на внешний сайт.

person Nitzan Tomer    schedule 22.05.2012
comment
Спасибо, я посмотрю на это. Для пояснения, я просто пытаюсь перемещаться между экранами в своем приложении на основе холста, а не переходить на другой сайт. - person Joe; 22.05.2012
comment
Итак, почему вы хотите использовать window.top.location? Просто используйте window.location, чтобы изменить URL-адрес вашего iframe, а не главного окна. - person Nitzan Tomer; 22.05.2012
comment
В этом весь смысл. Этот метод работает для Chrome и FF, но не работает для Safari. - person Joe; 22.05.2012
comment
Спасибо за вашу помощь, я обновил свой вопрос кодом, максимально приближенным к моему реальному коду. - person Joe; 23.05.2012
comment
Ошибка, которую вы опубликовали (небезопасная попытка JavaScript получить доступ к фрейму с URL-адресом), обычно не блокирует выполнение, а просто регистрируется. Может в сафари другая ошибка? Во-первых, это должно быть window.location.href = ..., а не только window.location, также можно добавить try/catch в начале функции для проверки. - person Nitzan Tomer; 23.05.2012
comment
Да, Facebook вызывает левых, правых и центральных. Я включил его для полноты картины, так как это было единственное зарегистрированное сообщение об ошибке. - person Joe; 23.05.2012
comment
Спасибо за помощь. Я не знаю, знакомо ли вам выражение, до которого расширяется «FFS», но… это. Это была опечатка в URL-адресе файла канала. Я удалю вопрос, но сначала хочу сказать спасибо! - person Joe; 23.05.2012

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

В любом случае, проблема заключалась в том, что файл канала (который, по всей видимости, является необязательным) не работал должным образом, и это вызвало проблему с Safari, но не с другими браузерами.

person Joe    schedule 23.05.2012