Ici dans le texte en bleu, la passerelle API répondra par 401: Non autorisé.
J'ai écrit la même raise Exception('Unauthorized')
dans mon lambda et j'ai pu le tester à partir de Lambda Console. Mais dans POSTMAN, je reçois le statut 500
Avec le corps:
{
message: null`
}
Je souhaite ajouter des messages d'erreur personnalisés tels que "Signature non valide", "TokenExpired", etc., Toute documentation ou tout conseil serait apprécié.
C’est tout à fait possible, mais la documentation est tellement mauvaise et déroutante.
Voici comment vous le faites:
Il existe un objet appelé $context.authorizer
auquel vous avez accès dans votre modèle de réponses de passerelle. Vous pouvez en lire plus à ce sujet ici: https://docs.aws.Amazon.com/apigateway/latest/developerguide/api-gateway-mapping-type-reference.html
Voici un exemple de remplissage de cet objet authorizer
à partir de votre autorisateur lambda comme suit:
// A simple TOKEN authorizer example to demonstrate how to use an authorization token
// to allow or deny a request. In this example, the caller named 'user' is allowed to invoke
// a request if the client-supplied token value is 'allow'. The caller is not allowed to invoke
// the request if the token value is 'deny'. If the token value is 'Unauthorized', the function
// returns the 'Unauthorized' error with an HTTP status code of 401. For any other token value,
// the authorizer returns an 'Invalid token' error.
exports.handler = function(event, context, callback) {
var token = event.authorizationToken;
switch (token.toLowerCase()) {
case 'allow':
callback(null, generatePolicy('user', 'Allow', event.methodArn));
break;
case 'deny':
callback(null, generatePolicy('user', 'Deny', event.methodArn));
break;
case 'unauthorized':
callback("Unauthorized"); // Return a 401 Unauthorized response
break;
default:
callback("Error: Invalid token");
}
};
var generatePolicy = function(principalId, effect, resource) {
var authResponse = {};
authResponse.principalId = principalId;
if (effect && resource) {
var policyDocument = {};
policyDocument.Version = '2012-10-17';
policyDocument.Statement = [];
var statementOne = {};
statementOne.Action = 'execute-api:Invoke';
statementOne.Effect = effect;
statementOne.Resource = resource;
policyDocument.Statement[0] = statementOne;
authResponse.policyDocument = policyDocument;
}
// Optional output with custom properties of the String, Number or Boolean type.
authResponse.context = {
"stringKey": "stringval custom anything can go here",
"numberKey": 123,
"booleanKey": true,
};
return authResponse;
}
La clé ici est d'ajouter cette partie:
// Optional output with custom properties of the String, Number or Boolean type.
authResponse.context = {
"stringKey": "stringval custom anything can go here",
"numberKey": 123,
"booleanKey": true,
};
Cela deviendra disponible sur $ context.authorizer
J'ai ensuite défini le modèle de mappage du corps dans l'onglet des réponses de la passerelle comme suit:
{"message":"$context.authorizer.stringKey"}
NOTE: il faut le citer!
enfin - après avoir envoyé une demande dans postman avec le jeton Authorization
pour refuser, je récupère maintenant une charge utile de postman qui ressemble à ceci:
{
"message": "stringval custom anything can go here"
}
j'utilise les solutions @maxwell à l'aide de la ressource personnalisée ResponseTemplates
. pour nier la réponse, voir comme ci-dessous.
{
"success":false,
"message":"Custom Deny Message"
}
vous pouvez vérifier cela, https://github.com/SeptiyanAndika/serverless-custom-authorizer
Je ne sais pas ce qui cause la réponse 500 message: null
. Peut-être une mauvaise configuration des autorisations de la fonction Lambda.
Pour personnaliser la réponse d'erreur non autorisée, vous allez configurer une réponse de passerelle pour le type d'erreur UNAUTHORIZED
. Vous pouvez configurer les en-têtes de réponse et la charge utile ici.
Ceci peut être facilement réalisé en utilisant la fonction context.fail ().
Exemple:
const customAuthorizer: Handler = (event, context: Context, callback: Callback) => {
authenticate(event)
.then((res) => {
// result should be as described in AWS docs
callback(null, res);
})
.catch((err) => {
context.fail("Unauthorized");
});
}
Cela retournera une réponse 401
avec le corps suivant.
{
"message": "Unauthorized"
}