Правильный подход к 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, имя) в сеансе
- если сеанс имеет зарегистрированное состояние, отображаемое имя и аватар при обработке шаблонов на сервере
Обеспокоенность
Ответы
Ответ 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