node.js - 通过 HTTP 确认 SNS 订阅时出现授权错误

标签 node.js amazon-web-services amazon-sns

我正在编写一个简单的 SNS 客户端,用于订阅 SNS 主题,然后收听通知。我可以成功提交 sns.subscribe 请求,但是当我从 AWS 获取 SubscriptionConfirmation POST 消息并尝试使用 sns.confirmSubscription 进行响应时我收到一个 AuthorizationError 返回:

[AuthorizationError: User: arn:aws:iam::xxx:user/mv-user is not authorized to perform: SNS:ConfirmSubscription on resource: arn:aws:sns:us-east-1:xxx:*]

如果我在对服务器的 GET 查询中使用完全相同的 Token 和 TopicArn,则订阅确认工作正常,无需身份验证。

知道为什么它不起作用吗?我的 SNS 主题是完全开放的,发布/订阅权限设置为“所有人”。

作为引用,我的代码是这样的:


        var params = {
            TopicArn: topicArn,  // e.g. arn:aws:sns:us-east-1:xxx:yyy
            Token: token         // long token extracted from POST body
        };

        sns.confirmSubscription(params, function (err, data) {
            if (err) {
                // BOOOM - keep getting here with AuthorizationError
            } else {
                // Yay. Worked, but never seem to get here :(
            }
        });

但是,如果我在浏览器中导航到与此类似的 URL(即完全未经身份验证),它会完美运行:

http://sns.us-east-1.amazonaws.com/?Action=ConfirmSubscription&Token=<token>&TopicArn=arn%3Aaws%3Asns%3Aus-east-1%3Axxx%3Ayyy&Version=2010-03-31

唯一的区别似乎是在编程版本中包含“授权”和“签名” header (使用 Wireshark 检查)。

有什么想法吗?提前致谢!

更新

在我的代码中,如果我只是以编程方式对 SubscriptionConfirmation 消息中的 SubscribeURL 执行简单的 GET 请求,则效果很好。 confirmSubscription API 调用不起作用似乎很奇怪。现在可能会坚持使用此解决方法。

更新2

在调用 sns.unsubscribe 时也会遇到同样的错误,尽管在每个通知中调用 UnsubscribeURL 仍然有效。似乎其他人也遇到过这个问题,但找不到任何解决方案。

最佳答案

我在开发我的应用程序时遇到了类似的问题。 我最终解决它的方式如下:

  1. 转到 IAM 并点击您的用户
  2. 转到权限选项卡并单击“附加策略”
  3. 使用过滤器过滤“AmazonSNSFullAccess”
  4. 将上述政策附加到您的用户。

上面应该处理它。

如果你想要花哨的,你可以创建一个基于“AmazonSNSFullAccess”的自定义策略并将其应用于你的用户。

自定义策略类似于以下内容:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "sns:ConfirmSubscription"
        ],
        "Effect": "Allow",
        "Resource": "YOUR_RESOURCE_ARN_SHOULD_BE_HERE"
    }
]
}

关于node.js - 通过 HTTP 确认 SNS 订阅时出现授权错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28025984/

相关文章:

javascript - 添加 Java Script 库作为 npm 依赖项或简单地将它们包含在 HTML 中有什么区别?

python - 是否可以在 python 中过滤 DynamoDB 查询结果?

amazon-web-services - 在 Neptune 的 OpenCypher 实现中模拟 MERGE

node.js - 如何使用 sinon stub 用 typescript 编写的类的私有(private)方法

node.js - 使用 Mustache 时模拟 Jade 的 'layout' 功能

php - Amazon SNS 移动推送 - 如何发送/发布到多个终端节点?

perl - Amazon SNS(简单通知服务)Perl 库

php - AWS SNS 发布的消息未推送到设备

mysql - 为什么我从 docker Node 应用程序连接到 localhost MySQL 时出现 ECONNREFUSED?

azure - 在 Azure 或 AWS 上托管 TFS