【问题标题】:AuthorizationError when confirming SNS subscription over HTTP通过 HTTP 确认 SNS 订阅时出现 AuthorizationError
【发布时间】: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


【解决方案1】:

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

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

上面应该照顾它。

如果您想花点心思,您可以创建一个基于“AmazonSNSFullAccess”的自定义策略并将其应用于您的用户。

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

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

【讨论】:

    【解决方案2】:

    错误说明了一切:

    [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 权限。

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

    【讨论】:

    • 是的,这似乎很明显,但我已经尝试了无限的权限,但似乎没有任何效果。事实上,无论如何似乎都没有“确认订阅”权限!未经授权的 HTTP GET 版本有效似乎很奇怪。当我有机会时,会再挖掘一点并添加我尝试过的权限。干杯。
    猜你喜欢
    • 2012-09-30
    • 2017-12-22
    • 1970-01-01
    • 2015-06-10
    • 2016-08-25
    • 2017-04-20
    • 2023-03-10
    • 2016-07-02
    • 1970-01-01
    相关资源
    最近更新 更多