网络应用程序的用途:用户访问网站,输入数据并选择他们负责的商店,然后点击提交。然后在后端 dynamoDB 将连接两组数据 - 用户联系人来存储信息。我正在使用 api 网关进行搜索并创建路由 - 除了允许 lambda 与 ES 和 dynamoDB 对话的 iam Angular 色之外,不涉及身份验证。
1) 我没有使用 Cognito 或进行身份验证 - 我不需要它用于此用例,这是用于调查应用程序。不过,我正在使用 Elasticsearch 来帮助我完成自动完成下拉/搜索字段。
2) 我能够进行正常的非签名 axios 调用来获取搜索结果(参见下面的代码 (A1))。 Params.url 具有 {endpoint}/indexname/_search。这是可行的,因为现在我的端点完全开放。
我想要完成的任务:我想锁定我的 ES 域,以便它更加安全。虽然 IAM Angular 色允许我的 lambda 与 ES 对话,但除非 ES 完全开放,否则我无法执行 (A1) 中所示的搜索功能。我知道我必须签署我的请求,但我对如何使用 aws4 等软件包来完成此操作有点困惑。 AWS 网站上显示的示例有点令人困惑,我没有成功复制它。
我已经使用 aws4 开始了这个过程(见 A2),但我不清楚如何让它工作。有人可以提供一些指导吗? 总结一下..:a) 如何使用 aws4 或任何其他方法实现签名请求,b) ES 域的策略应该是什么样子?
A1)
axios({
method: "post",
url: params.url,
headers: {
"Content-Type": "application/json"
},
data: {
query: {
query_string: {
default_field: "Building Description",
query: params.data
}
}
}
});
A2)
axios(aws4.sign({
host: process.env.ES_ENDPOINT,
method: "POST",
url: `https://${process.env.ES_ENDPOINT}/indexname/_search`,
path: "/indexname/_search",
}))
最佳答案
最简单的方法是使用 AWS JavaScript SDK 进行签名并为其提供有限范围的凭证。
注意:这并不意味着使用 AWS SDK ElasticSearch 客户端。
在 Lambda 中使用 AWS 开发工具包时,系统会为您完成此操作,但也可以在任何 JavaScript 环境中完成。尽管我会非常仔细地考虑在客户端使用它,但即使这样也有其用处。
可以找到为 JavaScript SDK 添加凭据的可能方法 here .
使用AWS JavaScript SDK向ES发出签名请求的示例可以参见here .
有几个基于资源的访问策略的示例 here 。我想您要查找的内容将位于该页面的下半部分。
关于javascript - 如果我不使用 cognito,如何使用 Nodejs 在 axios 中准确签署 AWS elasticsearch 搜索请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58906537/