2015-01-19 24 views
7

Tôi đang viết một máy khách SNS đơn giản có nghĩa là tự đăng ký chủ đề SNS và sau đó nghe thông báo. Tôi thành công có thể gửi một yêu cầu sns.subscribe, nhưng khi tôi nhặt nhắn SubscriptionConfirmation POST từ AWS và thử và đáp ứng sử dụng sns.confirmSubscription tôi nhận được một AuthorizationError trả về:AuthorizationError khi xác nhận đăng ký SNS qua HTTP

[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:*] 

Nếu tôi sử dụng giống hệt nhau Token và TopicArn trong một GET truy vấn đến máy chủ xác nhận đăng ký hoạt động tốt, không có xác thực.

Bất kỳ ý tưởng nào tại sao nó không hoạt động? Chủ đề SNS của tôi mở rộng với quyền xuất bản/đăng ký được đặt thành 'Mọi người'.

Để tham khảo, mã của tôi là một cái gì đó như thế này:


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

Tuy nhiên, nếu tôi hướng đến URL tương tự như sau trong trình duyệt (tức là hoàn toàn không được thẩm định), nó hoạt động một cách hoàn hảo:

http://sns.us-east-1.amazonaws.com/?Action=ConfirmSubscription&Token=<token>&TopicArn=arn%3Aaws%3Asns%3Aus-east-1%3Axxx%3Ayyy&Version=2010-03-31 

Sự khác biệt duy nhất dường như bao gồm tiêu đề 'Ủy quyền' và 'Chữ ký' trong phiên bản có lập trình (được kiểm tra bằng Wireshark).

Bất kỳ ý tưởng nào? Cảm ơn trước!

Cập nhật

Trong mã của tôi, nếu tôi chỉ programatically làm một yêu cầu GET đơn giản để các SubscribeURL trong thông điệp SubscriptionConfirmation này hoạt động tốt. Có vẻ lạ khi cuộc gọi API confirmSubscription không hoạt động. Có lẽ sẽ dính vào cách giải quyết này ngay bây giờ.

Cập nhật 2

Cũng nhận được lỗi tương tự khi gọi sns.unsubscribe mặc dù, một lần nữa, gọi UnsubscribeURL trong mỗi thông báo hoạt động. Dường như những người khác cũng gặp phải vấn đề đó nhưng không thể tìm ra giải pháp nào.

+0

quyền IAM cho 'mv-user' là gì? – tedder42

+0

Người dùng không có quyền hoặc vai trò IAM cụ thể. Tôi đã thử các cài đặt khác nhau cho người dùng trong chính sách Chủ đề SNS. Sẽ cập nhật bài đăng để hiển thị chính sách khi tôi quay lại văn phòng. –

+0

Và những gì thực sự bực bội, trang doc này (http://docs.aws.amazon.com/sns/latest/dg/UsingIAMwithSNS.html) nói "Tuy nhiên, các hành động ConfirmSubscription và Unsubscribe không yêu cầu xác thực, có nghĩa là ngay cả nếu bạn chỉ định những hành động đó trong một chính sách, IAM sẽ không hạn chế quyền truy cập của người dùng vào các hành động đó. " –

Trả lời

3

Lỗi nói lên tất cả:

[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:*] 

được về cơ bản nói với bạn rằng người sử dụng IAM bạn đang sử dụng để gọi ConfirmSubscription không có sự cho phép thích hợp để làm như vậy. Đặt cược tốt nhất là cập nhật quyền cho người dùng IAM đó, cụ thể là thêm các quyền ConfirmSubscription.

(Dựa trên nhận xét của bạn, mặc dù tài liệu nói khác đi, lỗi khá cụ thể ... có thể đáng giá sau trực tiếp với AWS về vấn đề này, vì thông báo lỗi hoặc tài liệu không chính xác).

+0

Vâng, có vẻ như rõ ràng nhưng tôi đã cố gắng không có kết thúc quyền và không có gì có vẻ làm việc. Trong thực tế có thậm chí không có vẻ là một sự cho phép 'Xác nhận phụ' anyway! Có vẻ kỳ quặc rằng phiên bản HTTP GET trái phép hoạt động. Sẽ đào nhiều hơn một chút và thêm quyền tôi đã thử khi tôi có cơ hội. Chúc mừng. –

0

Tôi gặp phải sự cố tương tự khi phát triển ứng dụng của mình. Con đường tôi đã kết thúc giải quyết nó như sau:

  1. đi đến IAM và nhấp chuột vào người dùng của bạn
  2. đi đến tab cho phép và click vào "Đính kèm chính sách"
  3. sử dụng bộ lọc để lọc cho "AmazonSNSFullAccess"
  4. Đính kèm chính sách ở trên cho người dùng của bạn.

Điều trên nên giải quyết vấn đề này.

Nếu bạn muốn được ưa thích, bạn có thể tạo chính sách tùy chỉnh dựa trên "AmazonSNSFullAccess" và áp dụng chính sách đó cho người dùng của bạn thay thế.

Chính sách tùy chỉnh sẽ là một cái gì đó tương tự như sau:

{ 
"Version": "2012-10-17", 
"Statement": [ 
    { 
     "Action": [ 
      "sns:ConfirmSubscription" 
     ], 
     "Effect": "Allow", 
     "Resource": "YOUR_RESOURCE_ARN_SHOULD_BE_HERE" 
    } 
] 
} 
Các vấn đề liên quan