Amazon web services AWS API网关自定义授权人授权配置异常

Amazon web services AWS API网关自定义授权人授权配置异常,amazon-web-services,aws-lambda,aws-api-gateway,custom-authentication,Amazon Web Services,Aws Lambda,Aws Api Gateway,Custom Authentication,对于Kinesis流,我使用AWSAPI网关创建了一个代理API。我为代理添加了一个使用python Lambda的自定义授权器。 在发布lambda函数和部署API之后,我能够使用网关测试功能成功地测试API。我可以在cloudwatch中看到日志,其中包含来自自定义auth lambda函数的详细打印。成功身份验证后,API网关将记录推送到my Kinesis流 然而,当我从Chrome Postman客户端调用相同的API时,我得到500个内部服务器错误,响应头包括X-Cache→ 来自c

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

然而,当我从Chrome Postman客户端调用相同的API时,我得到500个内部服务器错误,响应头包括X-Cache→ 来自cloudfront的错误,x-amzn-ErrorType→ 授权配置异常

Lambda auth函数返回允许对我的API执行请求的策略。返回的策略文档为:

{ "policyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "execute-api:Invoke", "Resource": [ "arn:aws:execute-api:us-east-1:1234567:myapiId/staging/POST/*" ], "Effect": "Allow" } ] }, "principalId": "Foo" } { “政策文件”:{ “版本”:“2012-10-17”, “声明”:[ { “操作”:“执行api:Invoke”, “资源”:[ “arn:aws:execute api:us-east-1:1234567:myapid/staging/POST/*” ], “效果”:“允许” } ] }, “principalId”:“Foo” }
为什么Chrome或curl的请求失败,而API Gateway的相同API测试工作正常?

授权配置异常通常表示API Gateway由于权限错误未能调用授权人


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

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

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

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

我遇到了同样的错误,在我的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.authorizer.numberKey或$context.authorizer.booleanKey,可以访问映射模板中上下文映射的stringKey、numberKey或booleanKey值(例如,“value”、“1”或“true”)。返回的值都是字符串化的请注意,不能将JSON对象或数组设置为上下文映射中任何键的有效值。


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

嘿,鲍勃,你能再详细介绍一下我如何“配置API网关调用的函数”吗?@Stretch你必须允许API网关调用你的函数。有关使用AWS CLI的示例,请参见。。简而言之,您的api gw需要具有Lambda/Invoke权限。如果您是通过swagger定义自定义授权人,请确保authorizerCredentials中的角色具有lambda/invoke,并且可由api gw(在受信任的实体中)进行假设。不正确
AuthorizerConfigurationException
适用于授权人执行期间引发的所有异常,除非它们使用网关响应映射进行映射。这基本上意味着您的授权人未返回策略或返回无效策略,或返回未授权API请求的策略。如果没有返回策略,授权者代码可能会由于某种原因而失败…文档中的细节和不清楚之处,但python lambda授权者的这一错误也让我大吃一惊-感谢您的澄清。因为人们仍然不工作,您可能在授权者脚本中访问了错误的头路径。示例:My Case:error:event.headers.Authorization Actual:event.authorizationToken完整结构:{type:'TOKEN',methodArn:'arn:aws:execute api:***',authorizationToken:'Basic****}记录您的传入并识别您的。>奇怪的是,当我从api Gateway“test”测试api时,相同的lambda函数没有出错特色。这是因为使用“test”功能会绕过授权者,直接调用lambda。除了返回json对象和上面Natan提出的问题外,还要确保返回对象中的键是camelCased。但是,正如其他人提到的那样,这个错误涉及范围广泛的问题。良好的日志记录将非常有用。