javascript - 如果我不使用 cognito,如何使用 Nodejs 在 axios 中准确签署 AWS elasticsearch 搜索请求?

标签 javascript node.js amazon-web-services elasticsearch

网络应用程序的用途:用户访问网站,输入数据并选择他们负责的商店,然后点击提交。然后在后端 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/

相关文章:

javascript - 当所有 HTML/CSS 和 Javascript 代码都被触发时,如何将 Javascript 代码触发到最后?

javascript - 在外部单击时隐藏元素

javascript正则表达式忽略chokidar的子目录

javascript - 如果我将函数体而不是函数名传递给 setTimeout 会发生什么?

c# - 即使从 OnClientClick 返回 false 后也会触发回发

javascript - 如何将 javascript 字符串值添加到 ASP 中隐藏字段的值

node.js - MongoDB - SSL 连接问题

amazon-web-services - 试图从容器内攻击 EKS 集群

amazon-web-services - 并行化 AWS Lambda 的最佳方式

python - S3 使用 boto3 删除文件夹内的文件