Отправка смс из java веб-приложения с помощью aws sns

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

Как я могу настроить Amazon AWS SNS для этого варианта использования?

Из того, что я прочитал, SNS работает веб-мастером, выбирая topic а затем каждый пользователь подписывается на эту тему. Затем веб-мастер рассылает сообщения в стиле широковещания всем подписчикам темы. Это не соответствует моим требованиям по отправке уникального сообщения каждому пользователю. В качестве альтернативы, создание отдельного topic для каждого телефонного номера было бы слишком громоздким, не говоря уже о создании проблем безопасности в отношении защиты конфиденциальности всех телефонных номеров.

Можно ли настроить Amazon AWS SNS для этого варианта использования? Если так, то как?

Я использую Java.

3 ответа

Некоторые методы устарели в AWS SDK.

BasicAWSCredentials awsCredentials = new BasicAWSCredentials("CLIENT-ID", "SECRET-KEY");
AmazonSNS snsClient = AmazonSNSClientBuilder.standard()
                     .withRegion(Regions.fromName("YOUR_REGION"))
     .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)).build();

Map<String, MessageAttributeValue> smsAttributes = new HashMap<String, MessageAttributeValue>();
smsAttributes.put("AWS.SNS.SMS.SenderID",new MessageAttributeValue().withStringValue("SENDER-ID").withDataType("String");
smsAttributes.put("AWS.SNS.SMS.SMSType",new MessageAttributeValue().withStringValue("Transactional").withDataType("String"));

PublishRequest request = new PublishRequest();
request.withMessage("YOUR MESSAGE")
.withPhoneNumber("E.164-PhoneNumber")
.withMessageAttributes(smsAttributes);
PublishResult result=snsClient.publish(request);

Темы SNS включаются только тогда, когда вам нужно отправить SMS-сообщение на несколько мобильных номеров. Если вы хотите отправить SMS-сообщение на один номер, вы можете использовать Amazon AWS SDK.

Документы доступны по адресу http://docs.aws.amazon.com/sns/latest/dg/sms_publish-to-phone.html.

Пример кода:

public static void main(String[] args) {
    AWSCredentials awsCredentials = new BasicAWSCredentials("YOUR_Client_ID", "YOUR_Client_secret");
    final AmazonSNSClient client = new AmazonSNSClient(awsCredentials);
    client.setRegion(Region.getRegion(Regions.REGION_YOU_WANT_TO_USE));

    AmazonSNSClient snsClient = new AmazonSNSClient(awsCredentials);
    String message = "My SMS message";
    String phoneNumber = "+1XXX5550100";
    Map<String, MessageAttributeValue> smsAttributes = 
            new HashMap<String, MessageAttributeValue>();
    //<set SMS attributes>
    sendSMSMessage(snsClient, message, phoneNumber, smsAttributes);
}

public static void sendSMSMessage(AmazonSNSClient snsClient, String message, 
    String phoneNumber, Map<String, MessageAttributeValue> smsAttributes) {
    PublishResult result = snsClient.publish(new PublishRequest()
                    .withMessage(message)
                    .withPhoneNumber(phoneNumber)
                    .withMessageAttributes(smsAttributes));
    System.out.println(result); // Prints the message ID.
}

Не забудьте создать пользователя на консоли IAM, добавив разрешение на доступ к службе SNS. Вам необходимо добавить роль AmazonSNSFullAccess.

Замените YOUR_Client_ID и YOUR_Client_secret созданными вами учетными данными пользователя.

Отправка SMS с помощью AWS SDK для Java:

public static void main(String[] args) {
        AmazonSNSClient snsClient = new AmazonSNSClient();
        String message = "My SMS message";
        String phoneNumber = "+1XXX5550100";
        Map<String, MessageAttributeValue> smsAttributes = 
                new HashMap<String, MessageAttributeValue>();
        //<set SMS attributes>
        sendSMSMessage(snsClient, message, phoneNumber, smsAttributes);
}

public static void sendSMSMessage(AmazonSNSClient snsClient, String message, 
        String phoneNumber, Map<String, MessageAttributeValue> smsAttributes) {
        PublishResult result = snsClient.publish(new PublishRequest()
                        .withMessage(message)
                        .withPhoneNumber(phoneNumber)
                        .withMessageAttributes(smsAttributes));
        System.out.println(result); // Prints the message ID.
}

Для этого конкретного случая использования вы должны рассмотреть AWS Service Engagement Service Amazon Pinpoint. Это позволяет отправлять SMS, электронные письма и push-уведомления, с инструментами для маркетинговых кампаний, а также аналитики:

Руководство разработчика Amazon Pinpoint

Документация включает в себя учебное пособие для вашего конкретного случая использования:

Настройка системы регистрации SMS с помощью Amazon Pinpoint

Для того, что вы описали, хотя это можно сделать с помощью SNS с AWS SDK для Java, Pinpoint разработан для взаимодействия с пользователями приложений, поэтому, вероятно, это лучшая альтернатива

Отдельные сообщения SMS/MMS находятся за пределами очевидных случаев использования AWS SNS.

Если вам нужно отправлять надлежащие текстовые сообщения SMS/MMS на произвольные телефонные номера, вам нужно обратиться к другим платформам, таким как Twilio или Bandwidth.

Другие вопросы по тегам