6
votes

Réponse d'autoriseur Lambda utilisant async / await dans Node.js

J'essaye de créer un autorisateur lambda sur aws en utilisant node.js async / await au lieu de callbacks mais il n'y a aucune information sur la façon de créer la réponse HTTP retournée à API Gateway. Par exemple, si je renvoie ceci:

{
    "statusCode": 403,
    "error": "Forbidden",
    "message": "No principalId set on the Response"
}

la passerelle API ne semble pas comprendre et renvoie une erreur 403 au client:

{
  statusCode: 401
}

Quelqu'un sait-il comment faire ce qui est décrit ici: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html mais en utilisant async / await?

Merci d'avance!

EDIT:

La façon de renvoyer une erreur 401 est simplement de lancer une erreur comme celle-ci: lancer une nouvelle erreur ("Non autorisé") Et si l'utilisateur refuse / autorise explicitement, renvoyez simplement la politique JSON.


5 commentaires

Pouvez-vous mettre ici un code pour essayer de vous aider, s'il vous plaît?


Si vous l'avez compris vous-même, vous êtes autorisé à répondre à vos propres questions :).


Avez-vous déjà compris cela? L'utilisation du callback provoque des avertissements mais je préfère utiliser async / await sans le cb.


@Chance La solution se trouve dans la section "Modifier" de mon article. Vous devez simplement lancer une erreur avec "Non autorisé" comme message. J'ai ajouté une réponse à ma propre question pour qu'elle soit plus visible.


@ julient-monisnap merci :). Assez simple!


3 Réponses :


0
votes

D'après ce que j'ai lu (certains exemples de code seraient utiles), il semble que vous n'appeliez pas le rappel correctement ou qu'il ne soit pas appelé au bon endroit. Vous pouvez utiliser

callback ("Some error message.");

pour renvoyer une réponse avec un code d'état 401. Vous pouvez également changer cela en faisant quelque chose comme:

var response = {
  statusCode: 401, /* some number */        
  body: "Oops!" /* some message */
}; 
callback(null, response); 

Je voudrais vérifier cette page pour plus d'informations.


1 commentaires

Merci pour la réponse, mais je ne veux pas utiliser de rappels. J'ai trouvé un moyen de le faire et je vais éditer mon message.



4
votes

Pour renvoyer une erreur 401, vous devez simplement lancer une erreur avec "Non autorisé" comme message, comme ceci:

throw new Error("Unauthorized")

Et si l'utilisateur refuse / autorise explicitement, renvoyez simplement le JSON politique comme vous le feriez avec les rappels.


0 commentaires

1
votes

Je pense que la solution acceptée ne fonctionne (plus). Je l'ai essayé comme ceci:

exports.authorize = async (event, context) => {
  throw new Error("Unauthorized")
}

Cela fonctionne mais dans mes journaux je peux voir cette erreur:

ERROR Invoke Error {"errorType": "Error" , "errorMessage": "Unauthorized", "stack": ["Error: Unauthorized", "at Runtime.exports.authorize [as handler] (/var/task/handler/auth.js:21:13)", " à processTicksAndRejections (internal / process / task_queues.js: 97: 5) "]}


2 commentaires

L'utilisez-vous dans un autorisateur lambda (pas un lambda ordinaire)? Et quelle version de node.js utilisez-vous?


Oui, autorisateur lambda. J'utilise Node 12.x.