【发布时间】:2016-08-12 17:40:48
【问题描述】:
我正在编写一个简单的 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
唯一的区别似乎是在程序版本中包含“授权”和“签名”标头(使用 Wireshark 检查)。
有什么想法吗?提前致谢!
更新
在我的代码中,如果我只是以编程方式对SubscriptionConfirmation 消息中的SubscribeURL 执行一个简单的GET 请求,则可以正常工作。 confirmSubscription API 调用不起作用似乎很奇怪。现在可能会坚持使用这种解决方法。
更新 2
调用sns.unsubscribe 时也会出现同样的错误,尽管在每个通知中调用UnsubscribeURL 仍然有效。似乎其他人也遇到了这个问题,但找不到任何解决方案。
【问题讨论】:
-
mv-user的 IAM 权限是什么? -
用户没有特定的 IAM 权限或角色。我在 SNS 主题策略中为用户尝试了各种设置。当我回到办公室时,将更新帖子以显示政策。
-
真正令人沮丧的是,这个文档页面 (docs.aws.amazon.com/sns/latest/dg/UsingIAMwithSNS.html) 说“但是,ConfirmSubscription 和 Unsubscribe 操作不需要身份验证,这意味着即使您在策略中指定这些操作,IAM 也赢了'不限制用户对这些操作的访问。"
标签: node.js amazon-web-services amazon-sns