*первоначально опубликовано*
*автор*
*Мика Силверман*
*, евангелист разработчиков в Stormpath, API, который позволяет разработчикам добавлять аутентификацию, авторизацию и управление пользователями в любое веб- или мобильное приложение за считанные минуты. Мика создал приложение на Spring Boot, использующее Java Helper Library от Twilio и Stormpath для отправки уведомлений о входе в систему.*
Сегодня, примерно за 30 секунд, я смог настроить аккаунт Twilio и отправить себе текстовое сообщение с помощью httpie. Ещё несколько минут работы (менее пяти), и у меня было приложение на Spring Boot, делающее то же самое.
Примерно за те же пять минут вы можете настроить платформу управления идентификацией как услугу от Stormpath и полюбить аутентификацию.
Мы действительно живём в золотой век облачных сервисов, которые не требуют установки на локальный компьютер.
Практически всё, что вы могли представить себе в области компьютеров или других устройств за последние 15 лет, теперь можно подключить и создать прототип за считанные минуты. Я помню, как примерно в 2007 году (после выхода первого iPhone) вёл переговоры с брокером SMS-услуг. После заполнения кипы бумаг, ожидания около четырёх месяцев и обязательств по крупным финансовым затратам мы были готовы писать код для работы с SMS-шлюзом. Тогда это было чем-то загадочным.
Пробовали ли вы когда-нибудь самостоятельно реализовать управление идентификацией? Добавляли ли вы соль к хэшам? Или, признайтесь, хранили пароли в открытом виде, как все тогда.
В этой статье мы объединим Stormpath и Twilio. Вот сценарий: когда пользователь входит в систему с нового устройства, мы хотим отправить ему SMS-уведомление, чтобы он знал об этом. Это распространённая практика сегодня, чтобы держать людей в курсе активности на их аккаунтах. Если я получаю уведомление о том, что вход был выполнен с нового адреса, и это был не я, значит, мой аккаунт был скомпрометирован.
Для целей этой демонстрации мы будем считать доступ с нового IP-адреса как вход с нового устройства.
Код для этой статьи можно найти здесь.
Первым шагом является создание аккаунта Stormpath. Вы можете следовать нашей документации по быстрому старту здесь. Вот основные шаги:
— Зарегистрируйтесь на https://api.stormpath.com/register
— Перейдите по ссылке в письме с подтверждением
— Создайте API-ключ для доступа к API (сохраните его в: `~/.stormpath/apiKey.properties`)
Исходный код этого примера можно найти здесь.
Пока не беспокойтесь о настройке Twilio — она отключена по умолчанию. В следующем разделе мы интегрируем и включим Twilio.
Интеграция Stormpath с Spring Boot позволяет легко инициировать дополнительные действия до и после входа пользователя. Именно этот механизм мы будем использовать для отправки сообщений через Twilio позже. Пока мы просто убедимся, что обработчик после входа работает.
Для использования интеграции Stormpath с Spring Boot достаточно добавить одну зависимость:
В данном случае мы используем интеграцию Spring Boot + Web MVC + Thymeleaf, чтобы возвращать шаблоны Thymeleaf.
Для настройки нашего `postLoginHandler` нужно просто создать конфигурацию Spring Boot, которая предоставляет бин:
Вы можете запустить приложение Spring Boot следующим образом:
Теперь вы можете перейти по адресу: `http://localhost:8080/register` для создания аккаунта в Stormpath. Затем перейдите по адресу: `http://localhost:8080/login`. В логах вы должны увидеть примерно следующее:
Ура! Наш обработчик после входа работает.
В этом примере мы моделируем следующий сценарий: отправка текстового сообщения (SMS) пользователю всякий раз, когда он входит в систему с нового местоположения. Для этого нам нужен номер телефона пользователя. Нам также нужно хранить массив местоположений, с которых пользователь входил ранее, чтобы определить, является ли текущее местоположение новым.
Здесь на помощь приходит `CustomData` от Stormpath. Мы заранее понимали, что не сможем охватить все варианты использования данных пользователей, которые могут понадобиться нашим клиентам. Поэтому мы прикрепили 10 МБ свободных JSON-данных к каждому первоклассному объекту Stormpath, включая учётные записи пользователей. Это и есть `CustomData`.
Мы сохраняем информацию о пользователе следующим образом:
Вот как это выглядит в административной консоли Stormpath:
Мы вернёмся к тому, как настраивается этот `CustomData`, как только интегрируем Twilio.
У Twilio есть краткое руководство, которое позволит вам быстро начать работу.
Основные шаги следующие:
— Введите основную регистрационную информацию
— Введите свой номер телефона
— Запросите номер телефона Twilio
— Проверьте, что вы можете отправлять сообщения с номера Twilio на свой номер телефона
Убедитесь, что вы выполнили тесты и можете отправлять сообщения. Вы можете протестировать это самостоятельно из командной строки с помощью curl или httpie:
Теперь, когда вы знаете, что можете использовать свой аккаунт Twilio, добавление его в качестве зависимости в приложение Spring Boot не составит труда:
Ранее мы настроили приложение Spring Boot для выполнения действия после успешного входа пользователя. Это действие просто записывало некоторую информацию в лог. Теперь мы собираемся интегрировать возможность отправки сообщений через Twilio с помощью этого же обработчика после входа.
Строки 8 и 9 извлекают номер телефона пользователя и список адресов, с которых пользователь ранее входил в систему. Эта информация берётся из `CustomData` пользователя.
Предполагая, что вход осуществляется с нового местоположения, строка 18 сохраняет новый адрес обратно в `CustomData`, а строка 20 отправляет сообщение через Twilio.
`TwilioLoginMessageBuilder` определён в примере и использует fluent-интерфейс.
Метод `send`, использованный в строке 26 выше, сначала проверяет, правильно ли настроен Twilio, и, если да, пытается отправить сообщение:
Давайте запустим приложение и посмотрим его в действии!
Перейдя на главную страницу `http://localhost:8080`, у вас будет возможность войти в систему. Если вы посмотрите в лог, то увидите, что при первом входе вы *не* получаете сообщение, потому что для вас не сохранён номер телефона.
Следующее, что нужно сделать, — это установить номер телефона:
Теперь вы можете выйти и снова войти в систему, и вы должны получить уведомление от Twilio:
В этой статье мы использовали возможность обработчика после входа от Stormpath и объединили её с возможностью отправки SMS от Twilio, чтобы создать новую функциональность, превосходящую возможности этих двух платформ по отдельности.
Определённо, это золотой век для сервисов.
В репозитории с кодом для этой статьи есть ещё немного магии Spring Boot, включая динамическую загрузку `defaultLoginPostHandler` или `twilioLoginPostHandler` на основе настроек конфигурации. Чтобы использовать обработчик Twilio, просто установите свойство `twilio.enabled=true` в файле `application.properties`.
Теперь идите и соединяйте сервисы вместе для удовольствия и прибыли!
Заинтересованы в изучении дополнительной информации об аутентификации пользователей с помощью Spring Boot и Stormpath? У нас есть другие отличные ресурсы, которые вы можете изучить: