Статьи

Управление идентификацией при весенней загрузке с помощью Twilio и Stormpath за 15 минут

Управление идентификацией здания, включая аутентификацию и авторизацию? Попробуйте Stormpath! Наш REST API и надежная поддержка Java SDK могут устранить риск для безопасности и могут быть реализованы за считанные минуты. Зарегистрируйтесь и никогда больше не создавайте аутентификацию!

Сегодня менее чем за 30 секунд я смог настроить учетную запись Twilio и отправить себе текстовое сообщение, используя httpie . Еще несколько минут работы (меньше 5), и у меня было приложение Spring Boot, делающее то же самое.

Примерно за те же пять минут вы можете настроить Identity Management в Stormpath в качестве сервисной платформы и научиться любить аутентификацию.

Мы действительно живем в золотой век не облачных (облачных) сервисов.

Почти все, что вы можете себе представить, проделав с компьютерами или другими устройствами за последние 15 лет, теперь вы можете зарегистрироваться и получить подтверждение концепции за считанные минуты. Я помню, как где-то в 2007 году (после iPhone 1) разговаривал с SMS-брокером. Заполнив пачку документов, подождав около четырех месяцев и потратив кучу денег, мы были готовы написать код против шлюза SMS. Это было какое-то загадочное дело тогда.

Вы когда-нибудь пытались свернуть свое собственное управление идентификацией? Вы солили свои хэши? Или просто признайте это — вы хранили пароли в открытом виде, как и все остальные тогда.

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

Twilio-спекулятивно-бело-1024x388

В целях этой демонстрации мы рассмотрим доступ к новому IP-адресу с нового устройства.

Код для этого поста можно найти здесь .

Настройка Stormpath

Первый шаг — создать учетную запись Stormpath. Вы можете следить за нашими документами Quickstart здесь . Это основные шаги:

Настройте 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:

54721858

Мы вернемся к тому, как CustomData эти CustomData как только мы добавим Twilio в микс.

Настроить Twilio

Twilio имеет QuickStart, который поможет вам быстро начать работу.

Основные шаги таковы:

  • Введите основную информацию о регистрации
  • Введите свой номер телефона
  • Предоставление номера телефона Twilio
  • Проверьте, что вы можете отправить сообщение со своего номера телефона Twilio на свой номер телефона

Убедитесь, что вы запускаете тесты и можете отправлять сообщения. Вы можете проверить это из командной строки самостоятельно, используя curl или httpie :

1
2
3
4
http -f POST \
https://api.twilio.com/2010-04-01/Accounts/<account sid>/Messages.json \
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 , у вас есть возможность войти в систему. Если вы посмотрите журнал, вы увидите, что при первом входе в систему вы не получите сообщение, потому что нет номер телефона для вас в файле.

7161604

15149852

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.

Следующее, что нужно сделать, это установить номер телефона:

34509960

Теперь вы можете выйти и войти снова, и вы должны получить уведомление Twilio:

22712755

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

51977529

Synergy!

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

Определенно золотой век для услуг.

В репозитории для этого поста есть еще немного волшебства Spring Boot, которое используется, включая динамическую загрузку defaultLoginPostHandler или twilioLoginPostHandler на основе настроек конфигурации. Чтобы использовать обработчик Twilio, просто установите twilio.enabled=true в файле application.properties .

Теперь идите и склейте некоторые услуги вместе для удовольствия и выгоды!

Учить больше

Хотите узнать больше об аутентификации пользователей с помощью Spring Boot и Stormpath? У нас есть другие замечательные ресурсы, которые вы можете просмотреть:

Управление идентификацией здания, включая аутентификацию и авторизацию? Попробуйте Stormpath! Наш REST API и надежная поддержка Java SDK могут устранить риск для безопасности и могут быть реализованы за считанные минуты. Зарегистрируйтесь и никогда больше не создавайте аутентификацию!

Кнопка-знак вверх, теперь