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

问题描述 投票:0回答:2

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

授权.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');
  }
}

s-function.json

responses:{ 
  "401 Unauthenticated.*": {
      "statusCode": "401"
  },
  "default": {
      "statusCode": "200",
      "responseModels": {
        "application/json;charset=UTF-8": "Empty"
      },
      "responseTemplates": {
        "application/json;charset=UTF-8": ""
      }
  }
}
aws-lambda aws-api-gateway serverless-framework
2个回答
12
投票

向 Amazon Web Services 询问后。

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

我终于改变了

callback('401 Unauthenticated');

context.fail('Unauthorized');

并且工作正常。

分享给可能遇到这个问题的人。


0
投票

如果您的自定义 auth lambda 无法返回策略文档,您的 API 将返回 500 错误。

正确使用

async
await
以获得正确的响应。

我试图执行的代码在承诺得到履行之前返回。您必须确保代码仅在履行承诺后才返回。

通过 API 授权者test 功能测试授权者,以获取导致自定义授权者 API 网关对失败的确切错误。

© www.soinside.com 2019 - 2024. All rights reserved.