Node.js 如何检索用户';通过Amazon API网关的公共IP地址+;Lambda(节点)

Node.js 如何检索用户';通过Amazon API网关的公共IP地址+;Lambda(节点),node.js,amazon-web-services,aws-lambda,aws-api-gateway,Node.js,Amazon Web Services,Aws Lambda,Aws Api Gateway,我目前正在编写一个Node.js lambda函数,我想在其中记录传入请求者的公共IP地址。我整天都在查看API网关和Lambda文档,但还没有找到解决方案 lambda事件对象是否包含可用于提取用户IP的请求元数据?在API网关中,它是值 $context.identity.sourceIp 您可以通过映射模板将其传递给Lambda。以下是在Lambda函数中使用API网关的$context.identity.sourceIp的简单演示 API映射模板: {     "sourceIP"

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


lambda
事件
对象是否包含可用于提取用户IP的请求元数据?

在API网关中,它是值

$context.identity.sourceIp


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

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

API映射模板:

{
    "sourceIP" : "$context.identity.sourceIp"
}
Lambda函数:

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

HTTP API更新

添加@Elijah的评论。HTTP API的格式将为

event['requestContext']['http']['sourceIp']
编辑

更好的方法实际上是检查

event['requestContext']['identity']['sourceIp']
您还可以从同一对象获取用户代理

event['requestContext']['identity']['userAgent']
见下面塞萨尔的评论。标题很容易被欺骗,用户可以将
X-Forwarded-For
设置为任何内容。AFAIK上面的
sourceIp
是从TCP连接检索的

原始答案

截至2017年9月,您可以在API网关中创建一个方法,该方法具有Lambda代理集成,这将使您能够访问

events['headers']['X-Forwarded-For']
它看起来像
1.1.1.1214.25.52.1


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

API网关应该已经在http头
X-Forwarded-For
中包含远程ip,因此您可以:

exports.handler = (event, context) => {
    console.log('ip:', event.headers['x-forwarded-for']);
};
//Lambda处理程序函数
module.exports.handlerFunc=异步(事件、上下文)=>{
//`X-Forwarded-For`应返回以逗号分隔的IP列表,第一个是远程IP:
//X-For:',…'
const remoteIp=event.headers['X-Forwarded-For'].split(',')[0]
//如果您想在事件和上下文中查看更多可用信息,请添加以下内容,部署并检查CloudWatch日志:
//日志(事件、上下文)
}

很酷。但是,我如何引用Lambda函数中传递的值呢?我尝试通过映射模板来做,做了几乎所有的事情,但都不起作用,是否有任何明确的分步引用或示例可以讨论它?显然,只有在使用“授权者”时才是这样。在API网关中。这太棒了。感谢映射信息=)仅供参考:对于代理集成,API网关将整个请求传递到后端,您没有任何选项来修改传递行为。对于Lambda代理集成,源IP包含在传递给函数的事件中。例如event.requestContext.identity.sourceipa另一个问题是否也可以获取用户代理?请注意,如果请求通过代理(在我的案例中是CloudFront),实际的客户端id将在
X-Forwarded-For
头中给出。如果您使用的是Lambda代理集成,这就是真正的答案。这比为每个方法添加映射容易得多。您的原始答案应该完全删除!用户可以伪造
X-Forwarded-For
头并将其更改为他们想要的任何内容。来自@Cesar的建议不完整:客户端确实可以在请求时设置
X-Forwarded-For
,这使得仅在您有受信任的代理且您的代码只信任最右边的值的情况下使用它非常重要。请参阅必须信任代理,以便在客户端传入的任何值的右侧插入其他IP,甚至覆盖该值。如果使用新的HTTP API而不是REST API,则它将是事件['requestContext'['HTTP']['sourceIp'],而不是事件['requestContext'['identity']['sourceIp']