2015-01-19 10 views
7

Sto scrivendo un semplice client SNS che si intende sottoscrivere a un argomento SNS e quindi ascoltare le notifiche. Posso presentare con successo una richiesta sns.subscribe, ma quando prendo in mano il messaggio SubscriptionConfirmation POST da AWS e cercare di rispondere utilizzando sns.confirmSubscription ottengo un AuthorizationError tornato:Autorizzazione Errore durante la conferma dell'iscrizione SNS su 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:*] 

Se uso esattamente lo stesso motivo e TopicArn in un GET interrogare al server la conferma dell'iscrizione funziona bene, senza autenticazione.

Qualche idea sul perché non funziona? L'argomento My SNS è completamente aperto con autorizzazioni di pubblicazione/sottoscrizione impostate su "Tutti".

Per riferimento, il mio codice è qualcosa di simile:


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

Tuttavia, se ci si dirige verso l'URL simile a questo in un browser (cioè completamente non autenticato), funziona perfettamente:

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

Le uniche differenze sembrano essere l'inclusione delle intestazioni 'Autorizzazione' e 'Firma' nella versione programmatica (verificata utilizzando Wireshark).

Qualche idea? Grazie in anticipo!

Aggiornamento

Nel mio codice, se ho appena programatically fare una semplice richiesta GET alla SubscribeURL nel messaggio SubscriptionConfirmation questo funziona bene. Sembra strano che la chiamata all'API confirmSubscription non funzioni. Probabilmente resterà fedele a questa soluzione alternativa per ora.

Update 2

anche ottenere lo stesso errore quando si chiama sns.unsubscribe anche se, ancora una volta, chiamando il UnsubscribeURL in ogni notifica funziona. Sembra che anche altre persone si siano imbattuti in questo problema, ma non riescono a trovare alcuna soluzione.

+0

Quali sono le autorizzazioni IAM per 'mv-user'? – tedder42

+0

L'utente non dispone di autorizzazioni o ruoli IAM specifici. Ho provato varie impostazioni per l'utente nella politica dell'argomento SNS. Aggiornerà il post per mostrare la politica quando torno in ufficio. –

+0

E ciò che è davvero frustrante, questa pagina doc (http://docs.aws.amazon.com/sns/latest/dg/UsingIAMwithSNS.html) dice "Tuttavia, le azioni ConfirmSubscription e Unsubscribe non richiedono l'autenticazione, il che significa che anche se si specificano tali azioni in una politica, IAM non limiterà l'accesso degli utenti a tali azioni. " –

risposta

3

L'errore dice tutto:

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

è fondamentalmente ti dice che l'utente IAM si sta utilizzando per chiamare ConfirmSubscription non dispone delle autorizzazioni necessarie per farlo. La soluzione migliore è aggiornare le autorizzazioni per quell'utente IAM, in particolare aggiungendo le autorizzazioni ConfirmSubscription.

(In base ai commenti, anche se la documentazione dice diversamente, l'errore è piuttosto specifico ... potrebbe valere la pena seguire direttamente con AWS su questo problema, poiché il messaggio di errore o la documentazione non sono corretti).

+0

Sì, sembra ovvio, ma ho provato a non finire le autorizzazioni e nulla sembra funzionare. In effetti, non sembra nemmeno esserci un permesso "Conferma sub"! Sembra strano che la versione HTTP GET non autorizzata funzioni. Scava un po 'di più e aggiungo le autorizzazioni che ho provato quando ne avrò la possibilità. Saluti. –

0

Ho affrontato un problema simile mentre sviluppavo la mia applicazione. Il modo in cui ho finito per risolverlo è la seguente:

  1. andare a IAM e fare clic sul tuo utente
  2. passare alla scheda delle autorizzazioni e fare clic su "Allega Policy"
  3. utilizzare il filtro per filtrare "AmazonSNSFullAccess"
  4. Allegare la politica di cui sopra al proprio utente.

Quanto sopra dovrebbe occuparsene.

Se vuoi essere elegante, puoi creare un criterio personalizzato basato su "AmazonSNSFullAccess" e applicarlo all'utente.

Il criterio personalizzato sarebbe qualcosa di simile al seguente:

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