Реализация Facebook PHP SDK (3.1.1) без $ _SESSIONs - PullRequest
3 голосов
/ 24 сентября 2011

Я использую Facebook в качестве опции для входа на свой веб-сайт, а затем выполняю запросы Graph API от их имени. Я обновляю и новый SDK JavaScript, и PHP SDK, чтобы использовать последние версии oAuth до 1 октября.

PHP SDK теперь поставляется с абстрактным BaseFacebook, и у них есть пример реализации класса Facebook, который опирается на PHP $_SESSION s. Я управляю довольно большим многосерверным веб-сайтом, что делает использование $_SESSION хитрым - я не могу использовать сеансы на основе файлов по умолчанию, а сеансы с поддержкой базы данных часто не подходят для повышения производительности. Не уверен, что я хочу их в Memcached, так как пользователи не должны выходить из системы, если она очищена и т. Д.

Конкретный класс требует, чтобы вы сохранили только 4 поля для каждого посетителя: state, code, access_token, user_id. Кажется, что не все из них действительно должны быть основаны на чистой $ _SESSION. Я пытаюсь определить, что на самом деле нужно идти куда ...

  • Например, данные state выглядят так, как будто они могут быть сохранены в файле cookie на стороне клиента, поскольку они используются только один раз для предотвращения CSRF.
  • Действительно ли аутентификация code нуждается в сохранении или она используется только один раз?
  • Могут ли user_id и access_token храниться в моей users базе данных MySQL? Если да, то как мне определить, кто является авторизованным пользователем Facebook, чтобы войти в него, используя файл cookie fbsr_?

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

В основном: Реально ли аутентифицировать пользователей FB без использования $ _SESSIONs? Где под "сессиями" я подразумеваю некоторый набор файлов cookie PHP для всех посетителей (вошел или нет), который связывает их с сервером данные.

Ответы [ 4 ]

4 голосов
/ 05 октября 2011

Я сделал некоторые изменения в файле Facebook.php из PHP SDK.Просто изменил все функции для работы с cookie вместо $ _SESSION.

// $_SESSION[$session_var_name] = $value;
setcookie($session_var_name, $value, time() + 3600, '/');

и т. Д.

и закомментировал код session_start:

//if (!session_id()) {
// session_start();
// }

Это простое решение, и оноработает отлично.

3 голосов
/ 24 сентября 2011

Вы правы относительно state и code, они предназначены для однократного использования при первоначальной аутентификации и не должны сохраняться на других страницах.

ИД пользователя могут храниться в базе данных, и часто это делается как постоянная запись. Access_token может храниться в базе данных, но, конечно, это не постоянное значение, и его придется часто обновлять. Но это может быть способом избежать использования сеансов или файлов cookie, если у вас есть какой-то другой способ идентифицировать пользователя, чтобы вы могли извлечь токен из БД.

Я никогда не сходил с ума от идеи использования PHP-сессий для приложений Facebook в любом случае из-за надежности файлов cookie. Возможно, вы захотите взглянуть на http://www.braintilt.com/fbcookies.php, чтобы узнать, как избежать зависимости от сеансов, которыми заполнено большинство примеров на Facebook. Конечно, если вы не против файлов cookie, вы можете установить свои собственные и просто использовать их для распространения идентификатора пользователя, а не методы GET / POST, описанные там.

2 голосов
/ 24 сентября 2011

Исходя из того, что я знаю, code не нужно хранить, так как он используется только один раз, во время аутентификации.
Возможно, вы захотите сохранить access_token, так как это поможет вам вызвать график api для информации о пользователе, если вам потребуется, но вы должны помнить, что он действителен только в течение 2 часов или около того. После этого вам придется выполнить повторную авторизацию, используя getLoginUrl().
user_id, очевидно, может быть сохранен, это user_id Facebook, и он не изменится. Однако, чтобы получить user_id, вам нужно проанализировать signed_request, который отправляет Facebook. Или вы можете напрямую позвонить getUser().
Когда getUser() возвращает значение NULL, вы знаете, что пользователь не прошел проверку подлинности в Facebook, и затем вы можете перенаправить пользователя на URL-адрес, возвращенный из getLoginUrl(), чтобы проверить подлинность вашего пользователя в Facebook. После аутентификации вы получите user_id, позвонив по номеру getUser().
Таким образом, вы знаете, что пользователь авторизован на Facebook, если getUser() возвращает user_id.
Facebook действительно улучшил документацию PHP SDK , вам не понадобится так много времени, чтобы пройти ее.
Итак, наконец, вы можете хранить все это в сеансах, однако вам лучше хранить user_id в вашей базе данных. Я хотел бы предложить, чтобы вы использовали сеансы для хранения access_token, а также всегда вызывали getUser (), чтобы узнать статус посетителя.
Надеюсь, вы получили то, что искали ..
редактировать: вы отправили один и тот же вопрос дважды !!!

0 голосов
/ 04 апреля 2013

Facebook PHP SDK (начиная с версии 3.0) разделен на две основные части: класс Facebook, используемый для взаимодействия с API Facebook и абстрактным классом BaseFacebook.Класс Facebook расширяет этот абстрактный класс.Абстрактный класс BaseFacebook реализует базовый API oAuth для Facebook, предоставляя все общедоступные функции, используемые при создании экземпляра нового объекта Facebook.

Функции, связанные с обработкой сеанса, - это абстрактные функции, которые реализованы вFacebook класс.Необходимо реализовать четыре функции:

/**
 * Stores the given ($key, $value) pair, so that future calls to
 * getPersistentData($key) return $value. This call may be in another request.
 *
 * @param string $key
 * @param array $value
 *
 * @return void
 */
abstract protected function setPersistentData($key, $value);

/**
 * Get the data for $key, persisted by BaseFacebook::setPersistentData()
 *
 * @param string $key The key of the data to retrieve
 * @param boolean $default The default value to return if $key is not found
 *
 * @return mixed
 */
abstract protected function getPersistentData($key, $default = false);

/**
 * Clear the data with $key from the persistent storage
 *
 * @param string $key
 * @return void
 */
abstract protected function clearPersistentData($key);

/**
 * Clear all data from the persistent storage
 *
 * @return void
 */
abstract protected function clearAllPersistentData();

Эти классы используются для получения, установки и очистки любых постоянных данных, используемых сеансом.В стандартном Facebook классе они используют переменную PHP $_SESSION для хранения этих данных.Реализуя эти функции в вашем собственном классе, который расширяет BaseFacebook, можно изменить на любой тип обработки сеанса, который вы пожелаете.

В BaseFacebook есть четыре ключа, которые хранятся в постоянных данных:«state», «code», «access_token» и «user_id».

«State» используется для определения текущего состояния при аутентификации запроса oAuth.Он не используется после получения «кода».

«Код» используется для получения «access_token» из Facebook.Он не используется после получения «access_token».

«access_token» используется в последующем запросе к API oAuth Facebook.Я считаю, что это хорошо только в течение 2 часов.

'user_id' - это идентификатор пользователя Facebook.Это значение является уникальным для этого пользователя и постоянным.Это может быть сохранено на неопределенный срок.

Эта информация все еще действительна в текущей версии SDK (на момент написания v3.2.2).

См. страницу разработчика Facebook для получения дополнительной информации о потоке входа в Facebook PHP oAuth.

...