gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:11:18 24 4
gpt4 key购买 nike

我想从 SNS 向 Node.js 服务器上托管的公共(public) API 端点发送 HTTP 请求。但是,我想将该 API 配置为仅接受来自该 SNS 主题的 POST 请求,而不接受其他请求。我可以在 SNS 消息中插入 token ,但我无法控制 SNS 消息。它来自 SES,以防电子邮件被退回。是否可以查看请求的域,并且仅允许来自受信任域(本例中为 AWS)的请求?

最佳答案

您不能将端点的可访问性限制为“仅限 SNS”——即使您知道 SNS 的 IP 地址范围,那也没有什么值(value),因为任何人都可能在使用 SNS。这将是一种错误的安全感。

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

You should verify the authenticity of a notification, subscription confirmation, or unsubscribe confirmation message sent by Amazon SNS. Using information contained in the Amazon SNS message, your endpoint can recreate the string to sign and the signature so that you can verify the contents of the message by matching the signature you recreated from the message contents with the signature that Amazon SNS sent with the message.

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

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

接下来,消息正文包含 SigningCertURL。这是您的代码获取 SNS 用于签署消息的证书的 URL。如果此 URL 的方案不是 https 并且主机名不是 sns.[region].amazonaws.com,则不下载证书,也不处理消息.

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

接下来,生成消息的规范哈希并根据消息提供的签名对其进行验证,如上面链接中所述。

如果消息确实来自 SNS,则签名将正确验证,并且应处理该消息。否则不应进行处理。

关于Node.js 如何创建只能由 SNS 主题访问的 API 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41072699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com