Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Аутентификация через общественные сети для JavaServer Faces (JSF)

Anna | 5.06.2014 | нет комментариев

Про урон от паролей при аутентификации пользователей сайта и вход через общественные сети написано теснее много. Но в основном это касается либо теоретических рассуждений, либо каких-то аспектов интеграции модуля на PHP в одну из CMS.

Я предлагаю вашему вниманию пример организации аутентификации пользователей сетей ВКонтакте, Facebook, Мой Мир, Яндекс, Одноклассники, Google, Twitter, LinkedIn средствами JSF2. Это всецело авторская разработка, охватывающая особенно знаменитых OAuth провайдеров рунета. Написана без применения сторонних библиотек, сервлетов, jsp и спрингов — только JSF2 и CDI.

Все это родилось при разработке платного сайта, предоставляющего службы обучения. Безусловно, Дабы принудить людей расстаться хоть с малой частью своих «кровных» необходимо дюже постараться. Трудная регистрация с паролями, е-мейлами, капчей и временными зонами этому не дюже содействует. Следственно было принято решение ограничиваться только логином и паролем (двукратно), никаких дополнительных вопросов! На практике это вылилось во множественные регистрации, забывание пароля, нередко теснее позже оплаты (как водится, своего лицевого счета никто не помнит) и тому сходственные неприятности. Анкету тоже фактически никто не заполнял, — службе поддержки пришлось не приторно.

Решение навязывалось само собой: обеспечить регистрацию и последующую аутентификацию пользователей «одним кликом». Общественные сети с спецтехнологией OAuth подходили безупречно. Авторизация у нас теснее была, необходимо было только получить некоторый неповторимый идентификатор. Что и было сделано.

На основной странице нашего сайта есть две кнопки «Вход» и «Регистрация». Технически их дозволено было бы совместить, так как у пользователя нет вероятности ошибиться — никаких данных вручную он не вводит. Если мы через OAuth получили идентификатор, которого еще нет в нашей базе — значит регистрируем нового пользователя, напротив легко пускаем в систему. Для нового пользователя дозволено еще показать приветствие.

Дотошный читатель спросит, а отчего необходимо было разрабатывать свое решение, чай для всякой соцсети теснее есть готовые библиотеки, реализующие каждый функционал? Да, есть. Но за данный «каждый», в данном случае излишний, функционал доводится платить лишним объемом, многочисленными зависимостями и необходимостью интеграции и поддержки различных (для всякой библиотеки) подходов. Чужие баги и уязвимости тоже не необходимо сбрасывать со счетов.

Выходит, разглядим подробнее как все устроено

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

Все начинается с login.xhtml, выглядит это так:
image
Иконки взяты из Програпака. За всякой иконкой закреплен вызов способа, тот, что формирует запрос и посредством редиректа отправляет пользователя на сайт провайдера OAuth.

Пример кода для Яндекс:

	String plainUrl = "https://oauth.yandex.ru/authorize?" 
				 "client_id="  yaId
				 "&response_type=code";
	FacesContext.getCurrentInstance().getExternalContext().redirect(plainUrl);

Позже того, как пользователь согласился с предложением дать доступ к его данным, он возвращается на наш сайт, принимающей стороной есть страница yaLogin.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"> 

<h:head></h:head>
<f:metadata>
	<f:viewParam id="code" name="code" value="#{yalogin.code}" />
	<f:viewParam id="error" name="error" value="#{yalogin.error}" />
	<f:viewParam id="state" name="state" value="#{yalogin.state}" />
	<f:event type="preRenderView" listener="#{yalogin.phase2()}" />
</f:metadata>
<body> 
</body> 
</html>

Как видим, полученные параметры code, error и state передаются в переменные класса и запускается способ phase2(), тот, что собственно и проводит дальнейшую обработку.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB