Node.js如何创build只能访问SNS主题的API端点?

我想从SNS发送一个HTTP请求到一个Node.js服务器上的公共API端点。 但是,我想configuration该API只接受来自该SNS主题的POST请求,而不是其他任何东西。 我可以在SNS消息中插入一个令牌,但是我不控制SNS消息。 如果电子邮件被退回,它将来自SES。 是否有可能看到请求的域名,只允许来自可信域名(本例中为AWS)?

即使您知道SNS的IP地址范围,因为任何人都可以使用SNS,所以您无法将端点的可访问性限制为“仅限SNS”。 这将是一种虚假的安全感。

但是,SNS消息的devise方式应该不需要通过IP地址来限制端点的可访问性。 无论如何,你应该这样做。

您应该validationAmazon SNS发送的通知,订阅确认或取消订阅确认消息的真实性。 使用Amazon SNS消息中包含的信息,您的端点可以重新创build要签名的string和签名,以便您可以通过将您从消息内容重新创build的签名与Amazon SNS与消息一起发送的签名进行匹配来validation消息内容。

http://docs.aws.amazon.com/sns/latest/dg/SendMessageToHttp.verify.signature.html

首先,HTTP请求标题x-amz-sns-topic-arn标识主题。 如果这不是您期望的主题,请不要处理该消息。 如果该值与消息本身中的TopicArn ,则不要处理该消息。

接下来,消息主体包含一个SigningCertURL 。 这是您的代码获取SNS用来签署消息的证书的URL。 如果此URL的scheme不是https而主机名不是sns.[region].amazonaws.com ,则不要下载证书,也不要处理该消息。

否则,从提供的URL中获取证书,并将其caching在本地的内存或磁盘上,这样您就不必使用所处理的每条消息来获取证书(通常您会看到重复使用的证书)。 确保您的用户代理未configuration为不针对信任存储和请求主机名validation目标服务器的证书。 在此configuration中,您可以确保证书本身确实来自SNS,因为您的用户代理不会与具有不可信证书的系统协商SSL,并且您已validation主机名是由AWS控制的。

接下来,生成消息的规范散列,并根据消息提供的Signature对其进行validation,如上面的链接所述。

如果消息真的来自SNS,则签名将被正确validation,并且消息应该被处理。 否则,不应该处理。