【问题标题】:Pass IAM identity of AWS API-Gateway calls to backend server将 AWS API-Gateway 调用的 IAM 身份传递给后端服务器
【发布时间】:2016-05-18 07:59:59
【问题描述】:

我们希望使用 AWS 将现有 API 设置为 SAAS 我们的代码已通过 elastic-beanstalk 部署,并且我们通过网关创建了对方法的访问以管理权限。

我们现在正尝试记录用户的活动,以进行计费

目前,我们找到的最佳解决方案涉及完整的调用记录(启用 CloudWatch Logs + 记录完整的请求/响应数据),这看起来相当繁重,甚至可能最终变得昂贵。

我们对集成请求中的请求正文进行了重新设计,为正文添加了一个映射模板,但这似乎很繁琐,但希望我们错过了更好的解决方案。

基本上,我们用生成的基本“passthrough”代码替换了默认的“passthrough”,并在其中添加了一个值“MyUserArn”:“$context.identity.userArn”,这使得请求正文充满了混乱,但看起来像是“避免破坏某些东西的最可靠方法”。

我们只想在标头或查询字符串参数中添加 IAM 用户标识符,但未能找到这是否可行。有几篇文章提到了“使用调用者凭据调用”选项,但我们也没有找到这个选项。
是与 cognito 相关还是其他?

我们是不是做错了什么?

【问题讨论】:

  • 你能澄清一下什么是“大混乱”吗?
  • 使用默认的“passthrough”创建body会在输出body中增加很多细节(body内容被移动到变量"body-json",还有很多数据比如"query params""content-type"和添加了"date"。我使用它是因为我认为它可能是必要的(如果需要传递非空值),但我现在可以更新这一点,因为我用$input.json('$'), "userArn" : "$context.identity.userArn" 的简单输出替换了所有这些. 填充原本为空的请求正文看起来并不像我需要的东西。

标签: amazon-web-services saas aws-api-gateway amazon-cloudwatch


【解决方案1】:

您有几种不同的选择来获取此信息,这两种选择各有取舍:

  1. 您当前的解决方案从映射模板中的$context.identity 中提取值,并将其作为正文的一部分发送到您的 Lambda。鉴于您的“大混乱”评论,您似乎反对这一点,但最终您可以控制传递给您的 Lambda 的内容。
  2. 在您的方法上启用“用户调用者凭据”,然后在您的 Lambda 中使用身份值。目前,这仅在您使用从 Cognito 身份验证流程提供的凭证并且确实要求 Lambda 调用也成为您的角色策略的一部分时才有效,但不需要对模板进行任何修改。

更新抱歉,我以某种方式错过了您使用的是 Beanstalk 而不是 Lambda。您绝对可以在集成请求中添加标头,然后从 $context.identity.userArn 中提取其值。

更新 2 双重道歉,在标题中使用上下文变量时,您省略了 $,因此您需要使用 context.identity.userArn

【讨论】:

  • 很高兴看到它的可能,但我没有找到任何关于将变量添加为标头值的语法的线索。提到的语法是method.request.{param_location}.{param_name},但对我来说不是很清楚。我试过GET.routeName.{$context.identity.userArn}.{"param"},但似乎我错了。 $context.identity.userArn 也不起作用...我只设法添加了常量标题,带有简单的引号:/
  • @Balmipour $context.identity.userArn 应该可以工作。文档是here。只是为了确保您已在 API 上启用 AWS_IAM 身份验证,对吗?
  • 当我输入这个值时,我得到Invalid mapping expression specified: Validation Result: warnings : [], errors : [Invalid mapping expression specified: $context.identity.userArn](在集成请求阶段将其设置在我的标题的“映射自”列中。) 是的,IAM 身份验证当然已启用,但无论如何,它只是在资源上输出一个空值'不需要身份验证,不是错误。
  • (忘了说我已经浏览了很多文档,包括这个。)我刚刚阅读了“设置方法和集成”部分,但没有找到任何关于放置 变量的信息 在标题中。
  • 你不能只在标题中使用变量,只能是单个值或常量字符串。不幸的是,我忘记了在标头映射中使用上下文变量时格式略有不同,请参阅上面的更新。
猜你喜欢
  • 2015-10-17
  • 2019-11-18
  • 1970-01-01
  • 2020-03-04
  • 2016-12-17
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多