如果我没有使用cognito,如何使用Nodejs在axios中准确地签署AWSElasticSearch请求?

jxct1oxe  于 2023-02-08  发布在  Node.js
关注(0)|答案(2)|浏览(92)
    • Web应用程序的用途:**用户访问网站,输入数据并选择他们负责的商店,然后点击提交。然后在后端dynamoDB将连接两组数据-用户联系人到商店信息。我使用API网关进行搜索并创建路线-不涉及身份验证,除了iam角色允许lambda与ES和dynamoDB对话。

1)我没有使用Cognito或身份验证-我不需要它在这个用例中,这是一个调查应用程序。但是,我使用Elasticsearch来帮助我的自动完成下拉/搜索字段。
2)我可以进行一个普通的无符号axios调用来获取搜索结果(见下面的代码(A1)),Params. url有{endpoint}/indexname/_ search,这是因为现在我的端点是完全打开的。

    • 我想要完成的:**我想要锁定我的ES域,这样它会更安全一些。虽然IAM角色允许我的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
        }
      }
    }
  });

答复2)

axios(aws4.sign({
    host: process.env.ES_ENDPOINT,
    method: "POST",
    url: `https://${process.env.ES_ENDPOINT}/indexname/_search`,
    path: "/indexname/_search",
}))
yxyvkwin

yxyvkwin1#

最简单的方法是使用AWS JavaScript SDK进行签名,并为其提供有限范围的凭据。

NB:这并不意味着使用AWS SDK ElasticSearch客户端。

当在Lambda中使用AWS SDK时,这是为您完成的,但它也可以在任何JavaScript环境中完成。虽然我会非常仔细地考虑在客户端使用它,但即使这样也有它的用途。
可以在here中找到为JavaScript SDK添加凭据的可能方法。
使用AWS JavaScript SDK向ES发出签名请求的示例见此处。
这里有几个基于资源的访问策略的例子。我想你要找的东西会在那页的下半部分。

ctrmrzij

ctrmrzij2#

aws4-axios库使这一点变得非常容易。

相关问题