通过HTTP确认SNS订阅时的AuthorizationError

Tim*_*don 8 amazon-web-services node.js amazon-sns

我正在编写一个简单的SNS客户端,用于订阅自己的SNS主题,然后收听通知.我可以成功提交sns.subscribe请求,但是当我SubscriptionConfirmation从AWS sns.confirmSubscription获取POST消息并尝试回复时,我得到一个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:*]
Run Code Online (Sandbox Code Playgroud)

如果我在服务器的GET查询中使用完全相同的Token和TopicArn,则订阅确认工作正常,没有身份验证.

任何想法为什么它不起作用?我的SNS主题是公开的,发布/订阅权限设置为"Everyone".

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


        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 :(
            }
        });

Run Code Online (Sandbox Code Playgroud)

但是,如果我在浏览器中导航到与此类似的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
Run Code Online (Sandbox Code Playgroud)

唯一的区别似乎是在程序化版本中包含"授权"和"签名"标题(使用Wireshark检查).

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

更新

在我的代码中,如果我只是以编程方式SubscribeURLSubscriptionConfirmation消息中的一个简单的GET请求,这可以正常工作.看起来很奇怪,confirmSubscriptionAPI调用不起作用.现在可能会坚持这种解决方法.

更新2

调用时也会出现相同的错误,sns.unsubscribe但再次调用UnsubscribeURL每个通知都有效.似乎其他人也遇到了这个问题,但找不到任何解决方案.

Fou*_*uad 5

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

  1. 转到 IAM 并单击您的用户
  2. 转到权限选项卡,然后单击“附加策略”
  3. 使用过滤器过滤“AmazonSNSFullAccess”
  4. 将上述策略附加到您的用户。

以上应该照顾它。

如果您想变得更漂亮,您可以创建一个基于“AmazonSNSFullAccess”的自定义策略并将其应用于您的用户。

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

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "sns:ConfirmSubscription"
        ],
        "Effect": "Allow",
        "Resource": "YOUR_RESOURCE_ARN_SHOULD_BE_HERE"
    }
]
}
Run Code Online (Sandbox Code Playgroud)


Kre*_*ase 4

错误说明了一切:

[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:*]
Run Code Online (Sandbox Code Playgroud)

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

(根据您的评论,即使文档另有说明,错误也非常具体......可能值得直接与 AWS 跟进此问题,因为错误消息或文档不正确)。