Подтвердить что ты не робот

Правильный подход к FB auth

В моем проекте используются Node.js и Express, но вопрос касается общего подхода.

Наши пользователи все из FB, и у нас нет никаких полномочий, кроме FB. Нам нужно связать некоторые действия с конкретными пользователями FB, а также нужно, чтобы их токены связывались с FB.

В настоящее время мы делаем это так:

  • пользователь приходит на страницу
  • есть невидимые блоки: один с заполнителями для аватара пользователя и имени ( "вошел в систему" ), другой с кнопкой, запускающей логин FB ( "выведенный из системы" )
  • используя FB JS SDK, мы проверяем статус входа пользователя. Если подключен (что на самом деле означает: зарегистрировался в FB, аутентифицировал наше приложение и предоставил все необходимые нам разрешения), мы получаем имя пользователя и идентификатор FB и показываем блок "вошедший в систему". В противном случае отображается "выведенный" блок
  • для зарегистрированных пользователей по некоторым действиям пользователь access_token передается на сервер через AJAX (здесь нет проблем, HTTPS) и используется кодом сервера для действий, таких как публикация на стене пользователя или что-то в этом роде
  • кнопка входа FB обрабатывается JS и вызывает FB.login()
  • в событии JS authResponseChanged предпринимаются очевидные действия (показать/скрыть заблокированные блоки входа/выхода)

Что хорошего: мы всегда знаем, что статус пользователя эффективен (токен TTL больше, чем обычный срок жизни страницы, поэтому мы здесь хорошо).

Что нам не очень нравится: * токены на стороне клиента недолговечны (да, мы можем их обменять, но не хотим, чтобы мы могли найти любую альтернативу) * обычно требуется несколько запросов к FB (1 - загрузить JS SDK, 2 - получить статус входа), пока мы не сможем что-то показать. До тех пор, пока не будет заблокирован блок 'login' нашего сайта.

Какой вопрос?

Мы ищем оптимальный способ использования некоторого кода на стороне сервера и, по крайней мере, отображаем имя пользователя и аватар, когда мы уверены, что пользователь вошел в систему.

Я могу представить себе такую ​​схему, как это:

  • используйте серверную авторизацию (с переадресацией), чтобы получить долгоживущий токен и сохранить его на сервере.
  • сохранить статус пользователя (вход/выход, идентификатор FB, имя) в сеансе
  • если сеанс имеет зарегистрированное состояние, отображаемое имя и аватар при обработке шаблонов на сервере

Обеспокоенность

4b9b3361

Ответ 1

Использование JS SDK - единственный возможный способ узнать статус пользователя в режиме реального времени. ( "в реальном времени" в кавычках, потому что результат FB.getLoginStatus также кэшируется - если вы хотите, чтобы он был точным во все времена, нужно использовать второй параметр для значения true.)

Если у вас установлен JS SDK для установки файлов cookie в вашем домене, PHP SDK может определить статус входа пользователя без каких-либо API-запросов по HTTP-адресу: он просто считывает идентификатор пользователя из файла cookie, поэтому Facebook:: getUser() получит идентификатор пользователя. Этого было бы достаточно, чтобы отобразить изображение, но для имени пользователя для этого все еще требуется запрос API.

Здесь вы можете выбрать для запроса имя один раз - и затем сохранить его в свой сеанс. Если в следующем запросе JS SDK указывает, что пользователь больше не подключен, вы можете удалить информацию о регистрации со страницы и/или принудительно перезагрузить (и при этом очистить сеанс), чтобы вернуться к зарегистрированное состояние.

Ответ 2

На самом деле совершенно неверно говорить, что "для того, чтобы быть в режиме реального времени, вам нужно использовать JS SDK"! Facebook имеет "API графиков обновлений в реальном времени", и каждый раз, когда некоторые данные обновляются, ваш локальный db автоматически обновляется, тогда вам не нужно использовать JS SDK