Amazon API Gateway 500中的自定义授权程序错误

Jim*_*Jim 6 aws-lambda aws-api-gateway serverless-framework

我使用Serverless-Authentication-boilerplate并希望映射自定义错误响应.但它总是返回500错误.

authorize.js

// Authorize
function authorize(event, callback) {
  let providerConfig = config(event);
  try {
    let data = utils.readToken(event.authorizationToken, providerConfig.token_secret);
    console.log("Decrypted data: " + JSON.stringify(data));

    let methodArn = event.methodArn.replace(/(GET|POST|PUT|DELETE)/g, '*').replace(/mgnt.+/g, 'mgnt/*');

    console.log(`Change methodArn to: ${methodArn}`);

    // TODO: handle expiration time validation
    callback(null, utils.generatePolicy(
      data.id, // which is $context.authorizer.principalId
      'Allow',
      methodArn));
  } catch (err) {
    console.log(err);
    callback('401 Unauthenticated');
  }
}
Run Code Online (Sandbox Code Playgroud)

S-function.json

responses:{ 
  "401 Unauthenticated.*": {
      "statusCode": "401"
  },
  "default": {
      "statusCode": "200",
      "responseModels": {
        "application/json;charset=UTF-8": "Empty"
      },
      "responseTemplates": {
        "application/json;charset=UTF-8": ""
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*Jim 8

在询问亚马逊网络服务之后.

遗憾的是,Authorizer的映射当前不可配置,并且lambda函数返回的每个错误都将映射到API网关中的500状态代码.此外,映射是在输出的精确字符串匹配上执行的,因此,为了将预期的401错误返回给客户端,您应该执行对'context.fail('Unauthorized');的调用.

最后,我改变了

callback('401 Unauthenticated');
Run Code Online (Sandbox Code Playgroud)

context.fail('Unauthorized');
Run Code Online (Sandbox Code Playgroud)

工作正常.

分享给谁可能遇到这个.

  • 问题是`context.fail('Unauthorized');`会导致lambda执行失败.当您在每次执行lambda失败时触发警报时,您将收到每个未授权请求的通知.这可能是一个过期的令牌,这很好,不应该导致lambda执行失败. (2认同)