Pasé la mayor parte del día tratando de hacer que los autorizadores funcionen, revisé varios ejemplos y todos parecen estar haciendo lo mismo que hace mi código.
Yo uso un marco sin servidor aquí está el código de autorización:
exports.handler = function (event: APIGatewayTokenAuthorizerEvent): APIGatewayAuthorizerResult { const authorizer = new Authorizer(); try { if (!event.authorizationToken) throw new Error("No token"); const token = event.authorizationToken.split(" ")[1]; const decodedData = authorizer.verifyToken(token) as unknown as User; const policy = generatePolicy(token, event.methodArn); return { ...policy, context: { user: JSON.stringify(decodedData), }, }; } catch (err) { console.log(err); throw "Unauthorized"; } }; const generatePolicy = (principalId: string, methodArn: string) => { return { principalId, policyDocument: { Version: "2012-10-17", Statement: [ { Action: "execute-api:Invoke", Effect: "Allow", Resource: methodArn, }, ], }, }; };y aquí está la configuración sin servidor
const serverlessConfiguration: AWS = { service: "user-crud", frameworkVersion: "2", custom: { webpack: { webpackConfig: "./webpack.config.js", includeModules: true, }, }, plugins: ["serverless-webpack"], provider: { name: "aws", runtime: "nodejs14.x", region: "eu-west-1", apiGateway: { minimumCompressionSize: 1024, shouldStartNameWithService: true, }, environment: { AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1", }, lambdaHashingVersion: "20201221", }, functions: { jwtAuthorizer: { handler: "src/api/authorizer.handler", name: "jwtAuthorizer", }, get: { name: "get", handler: "src/api/get.handler", role: "arn:aws:iam::109394173706:role/dynamodb_cloudwatch_full", events: [ { http: { path: "get", method: "get", cors: true, authorizer: "jwtAuthorizer", }, }, ], },}...
Siempre obtengo una respuesta de 500 cuando el token es correcto y devuelvo el objeto, así que supongo que hay algún problema con el objeto devuelto.
Si el token es incorrecto y lanzo "No autorizado", obtengo la respuesta 401 correcta.
Aparentemente, el controlador debe ser asíncrono, de lo contrario, espera una devolución de llamada... Tiempo bien invertido :|
Bueno, hay algunas otras razones para obtener,
{ message : null }error de Api Gateway. Me costó mucho identificar el mío.
Lambda Invoke Role para su autorizadorExecution failed due to configuration error: Invalid JSON in response: Unrecognized field "headers", not marked as ignorable en los registros de Api Gateway. Tienes que abordarlo agregando cors con una mención explícita de esos encabezados.boolean , debe habilitar la respuesta lambda 2.0delete RestApiGateway y crearlo de nuevo. En ocasiones, es posible que los cambios no se actualicen correctamente en CloudFront. function allowPolicy(methodArn) { console.log("Allow Policy") return { "principalId": "apigateway.amazonaws.com", "policyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "execute-api:Invoke", "Effect": "Allow", "Resource": methodArn } ] }, "context": { "stringValue": "blablabla", "numberValue": 10, "booleanValue": true, } }; }