【问题标题】:AWS API Gateway Custom Authorizer AuthorizerConfigurationExceptionAWS API Gateway 自定义授权方 AuthorizerConfigurationException
【发布时间】:2019-04-29 08:49:10
【问题描述】:

对于 Kinesis 流,我使用 AWS API Gateway 创建了一个代理 API。我使用 python Lambda 为代理添加了一个自定义授权方。 在发布 lambda 函数并部署 API 后,我能够使用网关测试功能成功测试 API。我可以在 cloudwatch 中看到日志,其中包含来自自定义 auth lambda 函数的详细打印。认证成功后,API Gateway 将记录推送到我的 Kinesis 流

但是,当我从 Chrome Postman 客户端调用相同的 API 时,我得到 500 Internal Server Error 并且响应标头包括 X-Cache → Error from cloudfront, x-amzn-ErrorType → AuthorizerConfigurationException

Lambda 身份验证函数返回允许对我的 API 执行请求的策略。返回的政策文件是:

{ “政策文件”:{ “版本”:“2012-10-17”, “陈述”: [ { “动作”:“执行 API:调用”, “资源”:[ “arn:aws:execute-api:us-east-1:1234567:myapiId/staging/POST/*” ], “效果”:“允许” } ] }, “principalId”:“Foo” }

为什么来自 Chrome 或 curl 的请求失败,但在 API Gateway 中同样的 API 测试工作正常?

【问题讨论】:

  • 这本质上意味着您的授权方没有返回策略或返回无效策略或返回未授权 API 请求的策略。如果未返回策略,授权代码将因某种原因失败...

标签: amazon-web-services aws-lambda aws-api-gateway custom-authentication


【解决方案1】:

AuthorizerConfigurationException 通常表示 API Gateway 由于权限错误而未能调用您的授权方。

请确保您已正确配置要由 API Gateway 调用的函数。一个简单的重置方法是删除该功能并将其重新添加到您的授权人。然后控制台会提示您添加必要的权限。

【讨论】:

  • 嗨,Bob,您能否详细介绍一下我将如何“配置我的函数以由 API 网关调用”?
  • @Stretch 您必须允许 API Gateway 调用您的函数。有关使用 AWS CLI 的示例,请参阅 this question
  • This documentation page goes deeper in the details。简而言之,您的 api-gw 需要具有 Lambda/Invoke 权限。如果您通过 swagger 定义自定义授权方,请确保 authorizerCredentials 中的角色具有 lambda/invoke 并且可由 api-gw(在受信任的实体中)承担。
  • 不正确。 AuthorizerConfigurationException 用于授权方执行期间抛出的所有异常,除非它们是使用网关响应映射映射的。
【解决方案2】:

找出导致问题的原因。从 python lambda 函数,我返回了一个 json 字符串实例。相反,它应该是 json 对象。 奇怪的是,当我从 API Gateway“测试”功能测试 API 时,相同的 lambda 函数没有出错。但是,当从 Internet(curl 或 chrome)调用 API 时,它失败了。

#return policy_string ... this is incorrect.
return json.loads(policy_string)

【讨论】:

  • 文档中的微妙和不清楚,但是这个来自 python lambda 授权者的确切错误也让我发现了 - 感谢您的澄清
  • 对于仍然不工作的人,您可能会在授权脚本中访问错误的标头路径。示例:我的案例:错误:event.headers.Authorization 实际:event.authorizationToken 完整结构:{ type: 'TOKEN', methodArn: 'arn:aws:execute-api:****', authorizationToken: 'Basic ** **' } 记录您的传入并识别您的。
  • > 奇怪的是,当我从 API Gateway“测试”功能测试 API 时,相同的 lambda 函数没有出错。这是因为使用“测试”功能绕过了授权者,直接调用了 lambda。
【解决方案3】:

我遇到了同样的错误,在我的例子中是一个 nodejs 函数,我将一个上下文键添加为数组。

{
  policyDocument: {
  Version: '2012-10-17',
  Statement: [{
    Action: 'execute-api:Invoke',
    Effect: effect,
    Resource: `${arn.split('/').slice(0, 2).join('/')}/*`,
  }],
},
context: {
  roles: ['admin']
}

正如医生所说:

您可以通过调用 $context.authorizer.stringKey, $context 来访问映射模板中上下文映射的 stringKey、numberKey 或 booleanKey 值(例如,“value”、“1”或“true”) .authorizer.numberKey 或 $context.authorizer.booleanKey,分别。返回的值都是字符串化的。 请注意,您不能将 JSON 对象或数组设置为上下文映射中任何键的有效值。

删除角色密钥,它就可以工作了。

【讨论】:

  • 除了返回一个 json 对象 stackoverflow.com/a/38640522/5031727 和上面 Natan 提出的问题,确保返回对象中的键是驼峰式的。但该错误涉及其他人提到的广泛问题。良好的日志记录将非常有帮助。
【解决方案4】:

就我而言,我没有返回格式正确的 IAM 政策文档。我的 Authorizer 函数对如何从请求中获取一些参数做了错误的假设,并且默认结果不是正确的策略(这是我的具体情况)。我设法使用 CloudWatch 日志服务对其进行了调试,传统的日志记录指令来自我的函数代码。

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 2016-11-30
    • 2019-03-04
    • 2018-04-17
    • 2018-03-21
    • 2018-03-09
    • 2019-09-06
    • 1970-01-01
    • 2018-03-08
    相关资源
    最近更新 更多