web-dev-qa-db-fra.com

Comment envoyer un message d'erreur personnalisé à partir du programme d'autorisation personnalisé d'API Gateway

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é.

8
imechemi

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"
}
7
maxwell

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

1
Septiyan Andika

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. 

0
Jack Kohn - AWS

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"
}
0
Lasitha Yapa