如何通过Amazon API Gateway + Lambda(节点)检索用户的公共IP地址

rde*_*ges 41 amazon-web-services node.js aws-lambda aws-api-gateway

我正在编写一个Node.js lambda函数,我想在其中记录传入请求者的公共IP地址.我一整天都在查看API网关和Lambda文档,但还没有找到解决方案.

lambda event对象是否包含我可以用来提取用户IP的请求元数据?

Ken*_*unn 34

以下是$context.identity.sourceIp在Lambda函数中使用API​​网关的简单演示.

API映射模板:

{
    "sourceIP" : "$context.identity.sourceIp"
}
Run Code Online (Sandbox Code Playgroud)

Lambda函数:

'use strict';
console.log('Loading function');
exports.handler = (event, context, callback) => {
    console.log('SourceIP =', event.identity.sourceIP);
    callback(null, event.identity.sourceIP);
};
Run Code Online (Sandbox Code Playgroud)

  • 对于Lambda代理集成,源IP包含在传递给函数的事件中.例如event.requestContext.identity.sourceIp (14认同)
  • 请注意,如果请求通过代理(在我的例子中是 CloudFront),则实际的客户端 ID 将在“X-Forwarded-For”标头中给出。 (3认同)

Jon*_*han 30

编辑

实际上更好的方法是检查

event['requestContext']['identity']['sourceIp']
Run Code Online (Sandbox Code Playgroud)

您还可以从同一对象获取User-Agent

event['requestContext']['identity']['userAgent']
Run Code Online (Sandbox Code Playgroud)

请参阅下面的Cesar评论.标题很容易被欺骗,用户可以设置X-Forwarded-For任何东西.sourceIp从TCP连接中检索上述AFAIK .

原始答案

截至2017年9月,您可以在API Gateway中使用Lambda Proxy集成创建方法,这将使您可以访问

events['headers']['X-Forwarded-For']
Run Code Online (Sandbox Code Playgroud)

这看起来像什么 1.1.1.1,214.25.52.1

第一个ip 1.1.1.1是用户的公共IP地址.

  • 如果您使用Lambda代理集成,这是真正的答案.比为每个方法添加映射要容易得多. (2认同)
  • 您的原始答案应该完全删除!`X-Forwarded-For` 标头可以被用户欺骗并更改为他们想要的任何内容。 (2认同)
  • @Cesar 的建议是不完整的:确实,客户端可以根据请求设置“X-Forwarded-For”,这使得仅在您拥有受信任代理并且您的代码仅信任代理的情况下才使用它非常重要最右边的值。请参阅 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For (2认同)

Mik*_*e76 10

在API网关中,它是值

$context.identity.sourceIp
Run Code Online (Sandbox Code Playgroud)

http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#context-variable-reference

您可以通过映射模板将其传递给Lambda.

  • 我尝试通过映射模板来做,几乎所有的事情都做了,但是没有用,有没有明确的分步参考或可以谈论它的示例? (2认同)