web-dev-qa-db-fra.com

Erreur d'affichage étrange de l'autoriseur personnalisé AWS API Gateway

Voici le contexte:

  • J'ai configuré une ressource dans la passerelle API./utilisateur/entreprise
  • Cette ressource a 2 méthodes. Obtenez et POST.
  • J'ai configuré un autoriseur personnalisé pour cette ressource.

Le problème:

  • Je peux appeler la méthode GET en envoyant les informations d'autorisation appropriées et j'obtiens les résultats comme prévu.
  • J'essaie d'envoyer une demande POST et j'obtiens l'erreur suivante:
{
  "message": "User is not authorized to access this resource"
}
  • Si j'attends quelques minutes, puis appelez la méthode POST, cela fonctionnera.
  • Si après avoir appelé la méthode POST et obtenu les résultats que j'appelle la méthode GET, il affichera la même erreur que celle mentionnée ci-dessus.

De plus, j'ai désactivé le cache pour l'autorisateur.

enter image description here

Qu'est-ce qui a pu causer ce problème?

15
Arman Fatahi

Cela pourrait être corrigé avec les deux options décrites dans la réponse du buggy: https://forum.serverless.com/t/rest-api-with-custom-authorizer-how-are-you-dealing-with -authorization-and-policy-cache/331

Version courte:

  1. Définissez TTL pour l'autorisation client sur 0
  2. Définissez la ressource de stratégie d'autorisation personnalisée sur "*"

J'ai essayé les deux solutions et ils ont résolu le problème avec "L'utilisateur n'est pas autorisé à accéder à cette ressource" pour moi.

12
Orest

Cette erreur se produira si vous utilisez event.methodArn en tant que ressource pour la stratégie générée et partager un autorisateur entre différentes fonctions, en raison du fonctionnement de la mise en cache des stratégies. Pour le jeton fourni, il met en cache une stratégie sur une API entière, ce sera la même entrée de cache pour toutes les méthodes et ressources au sein de la même API et de la même étape (si elles partagent le même autorisateur).

Par exemple, lorsque vous faites une demande à GET /users, ARN ressemblera à ceci:

arn:aws:execute-api:us-1:abc:123/prod/GET/users

Le prochain appel à n'importe quel point de terminaison avec le même jeton d'authentification utilisera une stratégie mise en cache, qui a été créée lors du premier appel à GET /users. Le problème avec cette stratégie mise en cache est que sa ressource n'autorise qu'une seule ressource particulière arn: ... /prod/GET/users, toute autre ressource sera rejetée.

En fonction de combien souhaitez-vous limiter les autorisations de stratégie, vous pouvez soit mentionner toutes les ressources possibles lors de la création d'une stratégie

{
  "principalId": "user",
  "policyDocument": {
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow",
        "Resource": [
          "arn:aws:execute-api:us-1:abc:123/prod/GET/v1/users",
          "arn:aws:execute-api:us-1:abc:123/prod/POST/v1/users",
          "arn:aws:execute-api:us-1:abc:123/prod/GET/v1/orders"
        ]
      }
    ],
    "Version": "2012-10-17"
  }
}

ou utilisez caractères génériques

"Resource": "arn:aws:execute-api:us-1:abc:123/prod/*/v?/*"

ou même

"Resource": "*"

Vous pouvez utiliser variables de stratégie pour certains modèles avancés.

Il est également possible d'utiliser une approche de liste noire en autorisant tout à l'aide de caractères génériques, puis en refusant des ressources spécifiques dans une autre déclaration de stratégie.

Sources:

3
Michael Radionov

Dans l'utilisation de votre code de construction de stratégie personnalisée, le module node js aws-auth-policy La partie Nodejs que vous pouvez utiliser,

AuthPolicy.prototype.allowAllMethods = function () {
  addMethod.call(this, "allow", "*", "*", null);
}

Dans le code

const AuthPolicy = require('aws-auth-policy');
  const policy = new AuthPolicy(principalId, awsAccountId, apiOptions);
           // policy.allowMethod(method, resource);
            policy.allowAllMethods();
            const authResponse = policy.build();
2
Subrata Fouzdar

J'ai résolu ce problème en définissant AuthorizerResultTtlInSeconds sur 0.

La raison en est que j'utilisais un autorisateur partagé. Cependant, l'autorisateur a travaillé en lisant le contexte d'événement de la demande et en accordant un IAM pour ensuite invoquer un lambda spécifique.

Parce que l'autorisateur était partagé, il mettait en cache la réponse qui était un IAM pour un lambda spécifique pendant les 300 secondes TTL (dans mon cas).

Par conséquent, je pourrais appeler une API une minute, puis pas la suivante.

Changer la valeur ci-dessus à 0 a résolu le problème.

1
Remotec