Как (правильно) расширить метод ScnSocialAuth \ Authentication \ Adapter \ HybridAuth :: authenticate ()?

Я использую модуль ScnSocialAuth ZF2 для включения аутентификации в социальных сетях в моем проекте.

Поскольку он использует ZfcUser в качестве одной из своих зависимостей, по умолчанию создаются / используются две таблицы БД:

CREATE TABLE `user`
(
`user_id`       INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`username`      VARCHAR(255) DEFAULT NULL UNIQUE,
`email`         VARCHAR(255) DEFAULT NULL UNIQUE,
`display_name`  VARCHAR(50) DEFAULT NULL,
`password`      VARCHAR(128) NOT NULL,
`state`         SMALLINT UNSIGNED
) ENGINE=InnoDB CHARSET="utf8";

а также

CREATE TABLE IF NOT EXISTS `user_provider` (
`user_id` INT NOT NULL,
`provider_id` varchar(50) NOT NULL,
`provider` varchar(255) NOT NULL,
PRIMARY KEY (`user_id`,`provider_id`),
UNIQUE KEY (`provider_id`,`provider`),
FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`)
) ENGINE=InnoDB;

Я хотел бы добавить больше полей в обе таблицы.

Первым шагом было изменение этих таблиц на моем сервере БД.

Затем я переопределил сущности / классы User и UserProvider (добавив свойства и их методы получения и установки) и настроил файлы конфигурации (zfcuser.global.php и scn-social-auth.global.php), чтобы они использовали их новые лица. До здесь все идет гладко.

Теперь я хочу получить данные профиля пользователя и сохранить их в эти таблицы во время аутентификации (даже используя эти данные, чтобы заполнить новую запись пользователя или обновить существующую).

Глядя на метод ScnSocialAuth \ Authentication \ Adapter \ HybridAuth :: authenticate (), я понял, что при аутентификации пользователя устанавливаются только следующие поля:

user.email
user.password
user.display_name
user_provider.user_id
user_provider.provider_id
user_provider.provider

оставив мои добавленные поля (например, пол, день рождения, регион и т. д.) пустыми.

Еще одна вещь, которую я заметил, проверив, как работает класс \ ScnSocialAuth \ Authentication \ Adapter \ HybridAuth, заключается в том, что сущности гидратируются «жестко». Например:

protected function facebookToLocalUser($userProfile)
{
...

$localUser = $this->instantiateLocalUser();
$localUser->setEmail($userProfile->emailVerified)
->setDisplayName($userProfile->displayName)
->setPassword(__FUNCTION__);
$result = $this->insert($localUser, 'facebook', $userProfile);

return $localUser;
}

Может кто-нибудь объяснить, что является лучшим способом расширить / переопределить метод authenticate (), чтобы я мог установить эти новые поля со значениями из профиля пользователя? Конечно, без изменения оригинального метода.

Спасибо

0

Решение

Картограф используется, чтобы взять информацию, предоставленную гибридным адаптером, и вставить в объект. Поэтому все, что вам нужно сделать, это убедиться, что у ваших новых методов сущностей есть установщики для полей, которые вы пытаетесь захватить. Предостережение: они должны соответствовать тому, что предоставляет адаптер. Например, адаптер github имеет следующее в getUserProfile

    $this->user->profile->identifier  = @ $data->id;
$this->user->profile->displayName = @ $data->name;
$this->user->profile->description = @ $data->bio;
$this->user->profile->photoURL    = @ $data->avatar_url;
$this->user->profile->profileURL  = @ $data->html_url;
$this->user->profile->email       = @ $data->email;
$this->user->profile->webSiteURL  = @ $data->blog;
$this->user->profile->region      = @ $data->location;

Это означает, что ваша организация должна иметь метод setPhotoUrl если это поле, которое вы хотите захватить. Но это имя поля, которое предоставляет реализация github. Не все поставщики имеют одинаковые данные под одним и тем же именем. Вы хотите проверить каждую реализацию гибридного адаптера getUserProfile чтобы найти поля, которые вы хотите / нужно.

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

0

Другие решения

Решение было дано в этом выпуске, открытом в github. https://github.com/SocalNick/ScnSocialAuth/issues/202

0

По вопросам рекламы [email protected]