Как я могу подтвердить запрос на подписку HTTP от amazon SNS

Я искал по сети и ничего не дал ясного ответа, чтобы подтвердить запрос на подписку от амазонки SNS. Я уже отправляю подписку с консоли amazon на свой сайт, но что дальше? Я использую amazon EC2 как мой сервер с PHP.

Ответ 1

Прежде чем вы даже настроите подписку на конечную точку HTTP/HTTPS через консоль управления AWS, вам необходимо убедиться, что конечная точка HTTP или HTTPS вашего веб-сайта PHP имеет возможность обрабатывать запросы HTTP POST, которые генерирует Amazon SNS. Существует несколько типов сообщений SNS: SubscriptionConfirmation, уведомление и UnsubscribeConfirmation. Вашему PHP-коду нужно получить заголовок x-amz-sns-message-type из запроса и обработать его на основе типа сообщения. Для сообщения SubscriptionConfirmation ваше приложение PHP должно обрабатывать тело сообщения POST, которое является документом JSON. Чтобы подписаться на эту тему, ваш PHP-код должен посетить "SubscriberURL", указанный в теле JSON. При желании вы должны проверить подпись, чтобы убедиться в подлинности сообщения, прежде чем подписываться на тему.

Более подробную информацию о документации AWS вы можете найти: http://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp.html

Ответ 2

Spring подписка на SNS с аннотацией

Spring Облако AWS поддерживает автоматическое подтверждение подписчика, вам просто нужно поместить эту аннотацию "@NotificationSubscriptionMapping"

@Controller
@RequestMapping("/topicName")
public class NotificationTestController {

    @NotificationSubscriptionMapping
    public void handleSubscriptionMessage(NotificationStatus status) throws IOException {
        //We subscribe to start receive the message
        status.confirmSubscription();
    }

    @NotificationMessageMapping
    public void handleNotificationMessage(@NotificationSubject String subject, @NotificationMessage String message) {
        // ...
    }

    @NotificationUnsubscribeConfirmationMapping
    public void handleUnsubscribeMessage(NotificationStatus status) {
        //e.g. the client has been unsubscribed and we want to "re-subscribe"
        status.confirmSubscription();
    }
}

http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_sns_support

Ответ 3

Конечная точка, которую вы указали, получит данные от службы проверки конечных точек SNS AWS. То же конечная точка будет использоваться для проверки конечной точки и получения уведомлений от aws,

Просто выгрузите вход, отправленный AWS SNS в один текстовый файл, например,

$json_write_to_text = json_decode(file_get_contents("php://input"));

Вы найдете все данные, отправленные AWS SNS, но просто найдите SubscriptionUrl (который будет определен для конечной точки, имеющей действительный токен). Откройте это в браузере, у вас будет статус SubscriptionConfirmation. Что он

Enjoy.

Ответ 4

Я решил это, используя бэкэнд NodeJS. Допустим, у вас есть API, подобный этому в HapiJS (ну, не важно, что у вас может быть другая технология).

{
    method: 'POST',
    path: '/hello',
    handler: ( request, reply ) => {

        reply( Hello.print(request.payload) );
    },
    config: {
        tags: ['api']
    }
}

Просто передайте полезную нагрузку, которую вы получаете, в свою бизнес-логику.

В бизнес-логическом процессе это выглядит как

    'use strict';
    const request = require('request');

    exports.print = (payload) => {

    payload = JSON.parse(payload);
    if(payload.Type === 'SubscriptionConfirmation'){

        return new Promise((resolve, reject) => {
            const url = payload.SubscribeURL;
            request(url, (error, response) => {

                if (!error && response.statusCode == 200) {
                    console.log('Yess! We have accepted the confirmation from AWS');
                    return resolve();
                }
                else 
                    return reject();
            });
        });
    }

Я использую модуль запроса из NPM для автоматического принятия таких запросов.

Другой способ - распечатать содержимое payload, а затем щелкнуть по URL-адресу, указанному в payload.SubscribeURL.

Как только AWS примет его, вы проверите подтверждение на странице Подписки, где Subscription ARN будет изменено с Pending Confirmation на сложное имя-cum-SHA с именем вашей темы.