Управление идентификацией здания, включая аутентификацию и авторизацию? Попробуйте Stormpath! Наш REST API и надежная поддержка Java SDK могут устранить риск для безопасности и могут быть реализованы за считанные минуты. Зарегистрируйтесь и никогда больше не создавайте аутентификацию!
Сегодня менее чем за 30 секунд я смог настроить учетную запись Twilio и отправить себе текстовое сообщение, используя httpie . Еще несколько минут работы (меньше 5), и у меня было приложение Spring Boot, делающее то же самое.
Примерно за те же пять минут вы можете настроить Identity Management в Stormpath в качестве сервисной платформы и научиться любить аутентификацию.
Мы действительно живем в золотой век не облачных (облачных) сервисов.
Почти все, что вы можете себе представить, проделав с компьютерами или другими устройствами за последние 15 лет, теперь вы можете зарегистрироваться и получить подтверждение концепции за считанные минуты. Я помню, как где-то в 2007 году (после iPhone 1) разговаривал с SMS-брокером. Заполнив пачку документов, подождав около четырех месяцев и потратив кучу денег, мы были готовы написать код против шлюза SMS. Это было какое-то загадочное дело тогда.
Вы когда-нибудь пытались свернуть свое собственное управление идентификацией? Вы солили свои хэши? Или просто признайте это — вы хранили пароли в открытом виде, как и все остальные тогда.
В этом посте мы соединим Stormpath и Twilio. Вот сценарий: когда пользователь входит в систему с нового устройства, мы хотим отправить ему SMS-уведомление, чтобы сообщить об этом. Сегодня это общепринятая практика — держать людей в курсе событий в своих аккаунтах. Если я получаю уведомление о том, что произошел вход с нового адреса, и это был не я, я знаю, что моя учетная запись была взломана.
В целях этой демонстрации мы рассмотрим доступ к новому IP-адресу с нового устройства.
Код для этого поста можно найти здесь .
Настройка Stormpath
Первый шаг — создать учетную запись Stormpath. Вы можете следить за нашими документами Quickstart здесь . Это основные шаги:
- Зарегистрируйтесь на Stormpath.com
- Нажмите на ссылку в письме с подтверждением
- Создайте ключ API для доступа к API (сохраните его в:
~/.stormpath/apiKey.properties
)
Настройте Stormpath Spring Boot Integration
Исходный код для этого примера можно найти здесь .
Пока не беспокойтесь о вещах Twilio — по умолчанию он отключен. В следующем разделе мы интегрируем и включаем Twilio.
Интеграция Stormpath Spring Boot позволяет легко запускать дополнительные действия до и после входа пользователя в систему. Именно этот механизм мы используем для отправки сообщений Twilio позже. Сейчас мы просто убедимся, что обработчик после входа в систему работает.
Чтобы использовать интеграцию Stormpath Spring Boot, вам нужно включить только одну зависимость:
1
2
3
4
5
|
< dependency > < groupId >com.stormpath.spring</ groupId > < artifactId >stormpath-thymeleaf-spring-boot-starter</ artifactId > < version >${stormpath.version}</ version > </ dependency > |
В этом случае мы используем интеграцию Spring Boot + Web MVC + Thymeleaf, чтобы мы могли возвращать шаблоны Thymeleaf .
Чтобы настроить наш postLoginHandler
, нам просто нужно создать конфигурацию Spring Boot, предоставляющую компонент:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
@Configuration public class PostLoginHandler{ ... @Bean @Qualifier ( "loginPostHandler" ) public WebHandler defaultLoginPostHandler() { return (HttpServletRequest request, HttpServletResponse response, Account account) -> { log.info( "Hit default loginPostHandler with account: {}" , account.getEmail()); return true ; }; } } |
Вы можете запустить приложение Spring Boot следующим образом:
1
2
|
mvn clean install mvn spring-boot:run |
Теперь вы можете перейти по http://localhost:8080/register
: http://localhost:8080/register
чтобы создать учетную запись в Stormpath. Затем вы можете перейти по http://localhost:8080/login
: http://localhost:8080/login
. Вы должны увидеть что-то подобное в выводе журнала:
1
|
2016-09-14 22:37:18.078 ... : Hit default loginPostHandler with account: [email protected] |
Ура! Наш хук после входа в систему работает.
Слово на CustomData
Сценарий использования, который мы моделируем в этом примере, заключается в отправке текстового сообщения (SMS) пользователю всякий раз, когда он входит в систему из нового местоположения. Для этого нам нужен номер телефона пользователя. Нам также необходимо сохранить массив местоположений, из которых они вошли, чтобы мы могли определить, входят ли они из нового местоположения.
Введите пользовательские данные CustomData
. С самого начала мы знали, что не можем собрать все варианты использования пользовательских данных, которые могут иметь наши клиенты. Итак, мы прикрепили 10 МБ данных JSON свободной формы к каждому первоклассному объекту Stormpath, включая учетные записи пользователей. Это CustomData
.
Мы храним информацию для пользователя так:
1
2
3
4
5
6
7
8
|
{ "loginIPs" : [ "0:0:0:0:0:0:0:1" , "104.156.228.126" , "104.156.228.136" ], "phoneNumber" : "+15556065555" } |
Вот как это выглядит в консоли администратора Stormpath:
Мы вернемся к тому, как CustomData
эти CustomData
как только мы добавим Twilio в микс.
Настроить Twilio
Twilio имеет QuickStart, который поможет вам быстро начать работу.
Основные шаги таковы:
- Введите основную информацию о регистрации
- Введите свой номер телефона
- Предоставление номера телефона Twilio
- Проверьте, что вы можете отправить сообщение со своего номера телефона Twilio на свой номер телефона
Убедитесь, что вы запускаете тесты и можете отправлять сообщения. Вы можете проверить это из командной строки самостоятельно, используя curl или httpie :
1
2
3
4
|
http -f POST \ To=< recipient +1...> From=< your twilio phone # - +1...> Body="Hello there..." \ --auth < account sid>:< auth token> |
Теперь, когда вы знаете, что можете использовать свою учетную запись Twilio, добавить ее в качестве зависимости в приложение Spring Boot совсем несложно:
1
2
3
4
5
|
< dependency > < groupId >com.twilio.sdk</ groupId > < artifactId >twilio-java-sdk</ artifactId > < version >(6.0,6.9)</ version > </ dependency > |
Свяжите все это вместе
Ранее мы настроили приложение Spring Boot для выполнения действия после успешного входа пользователя. Это действие было просто для регистрации некоторой информации. Теперь мы собираемся интегрировать возможность отправки сообщения Twilio, используя тот же обработчик после входа в систему.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
@Bean @Qualifier ( "loginPostHandler" ) public WebHandler twilioLoginPostHandler() { return (HttpServletRequest request, HttpServletResponse response, Account account) -> { log.info( "Account Full Name: " + account.getFullName()); CustomData customData = account.getCustomData(); String toNumber = (String) customData.get(phoneNumberIdentifier); List<String> loginIPs = getLoginIPs(customData); String ipAddress = getIPAddress(request); if (loginIPs.contains(ipAddress)) { // they've already logged in from this location log.info( "{} has already logged in from: {}. No message sent." , account.getEmail(), ipAddress); } else { boolean messageSent = TwilioLoginMessageBuilder .builder() .setAccountSid(twilioAccountSid) .setAuthToken(twilioAuthToken) .setFromNumber(twilioFromNumber) .setToNumber(toNumber) .send( "New login for: " + account.getEmail() + ", from: " + ipAddress); // only save the ip address if the twilio message was successfully sent if (messageSent) { saveLoginIPs(ipAddress, loginIPs, customData); } } return true ; }; } |
Строки 8 и 9 извлекают номер телефона пользователя и список адресов, с которых пользователь вошел в систему ранее. Он извлекает эту информацию из пользовательских данных пользователя.
Предполагая, что они входят в систему из нового местоположения, строка 18 сохраняет новый адрес обратно в CustomData
а строка 20 запускает сообщение Twilio.
TwilioLoginMessageBuilder
определен в образце и использует свободный интерфейс.
Метод send
используемый в строке 26 выше, сначала проверяет, правильно ли настроен Twilio, и, если это так, пытается отправить сообщение:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
TwilioRestClient client = new TwilioRestClient(accountSid, authToken); List<NameValuePair> params = new ArrayList<>(); params.add( new BasicNameValuePair( "To" , toNumber)); params.add( new BasicNameValuePair( "From" , fromNumber)); params.add( new BasicNameValuePair( "Body" , msg)); MessageFactory messageFactory = client.getAccount().getMessageFactory(); try { Message message = messageFactory.create(params); log.info( "Message successfuly sent via Twilio. Sid: {}" , message.getSid()); return true ; } catch (TwilioRestException e) { log.error( "Error communicating with Twilio: {}" , e.getErrorMessage(), e); return false ; } |
Давайте запустим приложение и увидим его в действии!
1
2
3
4
5
6
7
|
mvn clean install TWILIO_ACCOUNT_SID=<your twilio account sid> \ TWILIO_AUTH_TOKEN=<your twilio auth token> \ TWILIO_FROM_NUMBER=<your twilio phone number> \ TWILIO_ENABLED= true \ java -jar target/*.jar |
Нажав на входную дверь, http://localhost:8080
, у вас есть возможность войти в систему. Если вы посмотрите журнал, вы увидите, что при первом входе в систему вы не получите сообщение, потому что нет номер телефона для вас в файле.
1
2
|
2016-09-15 16:48:31.621 INFO: Account Full Name: micah silverman 2016-09-15 16:48:31.750 WARN: No toNumber set . Cannot proceed. |
Следующее, что нужно сделать, это установить номер телефона:
Теперь вы можете выйти и войти снова, и вы должны получить уведомление Twilio:
1
2
|
2016-09-15 16:53:44.599 INFO: Account Full Name: micah silverman 2016-09-15 16:53:46.080 INFO: Message successfully sent via Twilio. Sid: SM9cd7fdfa3f8f463dbdd8f16662c13b5b |
Synergy!
В этом посте мы рассмотрели возможности обработчика Stormpath после входа в систему и объединили его с возможностью SMS-сообщений Twilio для создания новых функций, превосходящих возможности двух этих платформ по отдельности.
Определенно золотой век для услуг.
В репозитории для этого поста есть еще немного волшебства Spring Boot, которое используется, включая динамическую загрузку defaultLoginPostHandler
или twilioLoginPostHandler
на основе настроек конфигурации. Чтобы использовать обработчик Twilio, просто установите twilio.enabled=true
в файле application.properties
.
Теперь идите и склейте некоторые услуги вместе для удовольствия и выгоды!
Учить больше
Хотите узнать больше об аутентификации пользователей с помощью Spring Boot и Stormpath? У нас есть другие замечательные ресурсы, которые вы можете просмотреть:
- Управление токенами OAuth 2.0 с помощью Spring Boot и Stormpath
- Единый вход для Java за 20 минут с помощью Spring Boot и Heroku
- 5 практических советов по созданию вашего Spring Boot API
Управление идентификацией здания, включая аутентификацию и авторизацию? Попробуйте Stormpath! Наш REST API и надежная поддержка Java SDK могут устранить риск для безопасности и могут быть реализованы за считанные минуты. Зарегистрируйтесь и никогда больше не создавайте аутентификацию!