通过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,订阅确认工作正常,没有身份validation。

任何想法,为什么它不工作? 我的SNS主题是广泛开放的发布/订阅权限设置为“每个人”。

作为参考,我的代码是这样的:

 var params = { TopicArn: topicArn, // eg 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(即完全未经validation的),则完美地工作:

 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 URL做一个简单的GET请求,这个工作正常。 只是似乎奇怪confirmSubscription API调用不起作用。 现在可能会坚持这个解决方法。

更新2

调用sns.unsubscribesns.unsubscribe出现同样的错误,但是,再次调用每个通知中的UnsubscribeURL 。 似乎其他人也遇到过这个问题,但找不到任何解决办法。

       

网上收集的解决方案 "通过HTTP确认SNS订阅时出现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:*] 

基本上告诉你,你用来调用ConfirmSubscription的IAM用户没有适当的权限来这样做。 最好的办法是更新该IAM用户的权限,特别是添加ConfirmSubscription权限。

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

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

  1. 去IAM,然后点击你的用户
  2. 去权限选项卡,然后点击“附加策略”
  3. 使用filter来过滤“AmazonSNSFullAccess”
  4. 将上述政策附加到您的用户。

上面应该照顾它。

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

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

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