通过HTTP确认SNS订阅时发生AuthorizationError

我正在编写一个简单的SNS客户端,用于订阅SNS主题,然后收听通知。 我可以成功提交sns.subscribe请求,但是当我从AWS获取SubscriptionConfirmation POST消息并尝试使用sns.confirmSubscription响应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

唯一的区别似乎是编程版本中包含'授权'和'签名'标题(使用Wireshark进行检查)。

有任何想法吗? 提前致谢!

更新

在我的代码中,如果我只是编程式地对SubscriptionConfirmation消息中的SubscribeURL执行一个简单的GET请求,这可以正常工作。 confirmSubscription API调用不起作用似乎很奇怪。 现在可能会坚持这种解决方法。

更新2

调用sns.unsubscribesns.unsubscribe出现同样的错误,虽然在每个通知中都调用了UnsubscribeURL 。 似乎其他人也遇到过这个问题,但无法找到任何解决方案。


错误说明了一切:

[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:*]

基本上告诉你,您用来调用ConfirmSubscription的IAM用户没有适当的权限来执行此操作。 最好的办法是更新该IAM用户的权限,特别是添加ConfirmSubscription权限。

(根据您的意见,即使文档中有其他说明,错误也是非常具体的......可能值得直接跟随AWS跟踪此问题,因为错误消息或文档不正确)。


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

  • 去IAM并点击你的用户
  • 进入权限标签并点击“附加策略”
  • 使用过滤器来过滤“AmazonSNSFullAccess”
  • 将上述政策附加到您的用户。
  • 以上应该照顾它。

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

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

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sns:ConfirmSubscription"
            ],
            "Effect": "Allow",
            "Resource": "YOUR_RESOURCE_ARN_SHOULD_BE_HERE"
        }
    ]
    }
    
    链接地址: http://www.djcxy.com/p/24283.html

    上一篇: AuthorizationError when confirming SNS subscription over HTTP

    下一篇: Clear doctrine cache in redis on deploy