Отправка смс из 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 разработан для взаимодействия с пользователями приложений, поэтому, вероятно, это лучшая альтернатива