我正在编写一个简单的 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
仍然有效。似乎其他人也遇到过这个问题,但找不到任何解决方案。
最佳答案
我在开发我的应用程序时遇到了类似的问题。 我最终解决它的方式如下:
- 转到 IAM 并点击您的用户
- 转到权限选项卡并单击“附加策略”
- 使用过滤器过滤“AmazonSNSFullAccess”
- 将上述政策附加到您的用户。
上面应该处理它。
如果你想要花哨的,你可以创建一个基于“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/