通过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.unsubscribe
时sns.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,然后点击你的用户
- 去权限选项卡,然后点击“附加策略”
- 使用filter来过滤“AmazonSNSFullAccess”
- 将上述政策附加到您的用户。
上面应该照顾它。
如果你想花哨,你可以创build一个基于“AmazonSNSFullAccess”的自定义策略,并将其应用于你的用户。
自定义策略将类似于以下内容:
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "sns:ConfirmSubscription" ], "Effect": "Allow", "Resource": "YOUR_RESOURCE_ARN_SHOULD_BE_HERE" } ] }