Статьи

Аутентификация в социальной сети: объединение учетных записей

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

Слияние аккаунтов

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

Настроить

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

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) DEFAULT NULL,
  `firstname` varchar(50) NOT NULL,
  `lastname` varchar(50) NOT NULL,
  `emailaddress` varchar(50) NOT NULL,
  `city` varchar(50) NOT NULL,
  `birtdate` date NOT NULL,
  `gender` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Примечание. Как видите, я использовал поля, которые мы также использовали в нашем SocialLoginInterface Вам может понадобиться больше или меньше полей в зависимости от вашего приложения. Вы даже можете разделить эту таблицу на таблицы useruser_profile

Вторая таблица содержит все данные о любых сторонних логинах, которые использовал пользователь.

 CREATE TABLE IF NOT EXISTS `user_provider` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) COLLATE utf8_unicode_ci NOT NULL,
  `provider` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `provider_uid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

В provider В столбце provider_uid

Слияние учетных записей пользователей вручную

Давайте представим, что пользователь зарегистрирован через Google+. Позже он возвращается и регистрируется через вашу стандартную систему регистрации. После входа в систему он внезапно вспоминает, что уже один раз входил в систему с Google+.

В соответствии с приведенной выше схемой базы данных в useruser_provider Лучший способ объединить эти две учетные записи — позволить пользователю подключить другие социальные сети к своей учетной записи.

Вы можете сделать это, позволив пользователям «войти» в социальную сеть, после того как вы уже авторизованы в вашей системе. Однако вместо «войти» мы теперь будем называть это «подключаться».

Просто добавьте кнопку «Соединить» в ваше приложение, которое вызывает URL для входа в систему из социальной сети, как вы, вероятно, делали это на странице входа. Как только URL обратного вызова вызывается, вы проверяете, находится ли предоставленный идентификатор пользователя из социальной сети в вашей таблице user_provider

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

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

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

Однако существует также возможность того, что пользователь вошел в систему через Google+ и теперь хочет объединить свою учетную запись с уже существующей учетной записью, которая была зарегистрирована через систему регистрации по умолчанию. В этом случае вы можете просто попросить пользователя ввести имя пользователя и пароль. После заполнения вы можете проверить, есть ли на самом деле комбинация, доступная в user

Автоматическое объединение учетных записей

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

Хорошее начало — проверка адреса электронной почты. Адрес электронной почты — это поле, которое не может быть легко подделано и является совершенно уникальным. Таким образом, после того, как вы вернули все данные из социальной сети, вы можете проверить, существует ли уже найденный вами адрес электронной почты в базе данных. Если это так, вы, кажется, нашли совпадение. Вместо создания нового пользователя вы можете обновить этого существующего пользователя.

Это оно? Я бы хотел, чтобы это было Однако не все социальные сети возвращают адрес электронной почты. Twitter, например, не возвращает адрес электронной почты, и вы не можете получить его другим способом. Кроме того, кто сказал, что мой адрес электронной почты Google+ такой же, как я использовал в вашем приложении? В конце концов, нет полной гарантии, что вы объединили все возможные аккаунты.

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

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

Итак, можем ли мы на самом деле объединить, основываясь на этих деталях? Нет! Вы только что открыли потенциальный недостаток безопасности, если сделали это. Только представьте, что я выдает себя за кого-то в Google+. Зайдя в ваше приложение, я смогу взять под контроль учетную запись, которую я изображаю. Чтобы этого не происходило, нам нужно добавить еще один шаг между входом в систему и фактическим слиянием: проверка.

Всякий раз, когда пользователь входит в систему через Google+ и ваша система обнаруживает возможное совпадение в вашей базе данных, попросите пользователя подтвердить. Самый простой способ — сообщить пользователю, что вы нашли потенциально уже существующую учетную запись. Затем позвольте этому пользователю проверить, что это он, разрешив ему первоначальный вход в систему. Поэтому, если существующая учетная запись была создана через вашу систему регистрации по умолчанию, разрешите пользователю ввести пароль для этой учетной записи. Если учетная запись была создана с помощью другого входа в систему, разрешите пользователю снова войти в систему с помощью того же метода. Если пользователь делает это, и вы получаете положительный результат проверки, вы точно знаете, что получили правильного пользователя.

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

Вывод

С этой статьей мы достигли конца этой серии. Надеемся, что эти статьи научили вас тому, как создавать независимые от фреймворка пакеты, как настроить социальный вход в Google+ и как объединять аккаунты.

Некоторые последующие статьи скоро появятся в сети и покажут вам, как расширить эти статьи в других социальных сетях. Я с нетерпением жду ваших отзывов в комментариях ниже.