Voici le contexte:
Le problème:
{
"message": "User is not authorized to access this resource"
}
De plus, j'ai désactivé le cache pour l'autorisateur.
Qu'est-ce qui a pu causer ce problème?
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:
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.
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:
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();
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.