【问题标题】:Generate AWS Signed Requests in Angular在 Angular 中生成 AWS 签名请求
【发布时间】:2020-04-20 03:16:59
【问题描述】:

从我的 Angular 8 应用程序中,我想调用托管在 AWS API Gateway 上的 REST 端点。端点的授权是AWS_IAM,表示请求需要签名。

如何在 Angular 中完成签名请求?有一个流行的 JavaScript 包 aws4 (https://www.npmjs.com/package/aws4),这将是我的首选。但是,我无法在我的 Angular 应用程序中使用这个 JS 包。这就是我所做的:

  1. npm install aws4 在 Angular 项目文件夹中
  2. import * as aws4 from '../../../node_modules/aws4/aws4.js'; 在我的 api.service.ts(这是用于调用 API 的角度服务)中。

在我的 API 服务中使用 sign 方法时

const signedRequest = aws4.sign(opts, {
accessKeyId: accessKey,
secretAccessKey: secretKey,
sessionToken: session})

我收到以下错误:

未捕获的 ReferenceError:缓冲区未定义在 Object../node_modules/core-util-is/lib/util.js at _webpack_require_

我也尝试在我的 API 服务中使用声明 declare var aws4: any而不是导入,但是我总是收到上述错误。

如何将包 aws4 导入 Angular 8,或者如何在 Angular 8 应用程序中为 AWS 生成签名请求而不执行每个步骤(这意味着我想使用库)。

更新: 添加缓冲区后,我收到以下错误:

未捕获的类型错误:无法读取未定义的属性“切片” 在 Object../node_modules/readable-stream/lib/_stream_writable.js (_stream_writable.js:57) 在 webpack_require (bootstrap:79) 在 Object../node_modules/readable-stream/readable-browser.js (可读-browser.js:4) 在 webpack_require (bootstrap:79) 在 Object../node_modules/stream-browserify/index.js (index.js:28) 在 webpack_require (bootstrap:79) 在 Object../node_modules/hash-base/index.js (index.js:3) 在 webpack_require (bootstrap:79) 在 Object../node_modules/md5.js/index.js (index.js:3) 在 webpack_require (bootstrap:79)

【问题讨论】:

  • 如果您无法使用当前版本的 aws4 进行这项工作,那么您可以考虑安装不依赖且不依赖 Buffer 的旧版本。跨度>

标签: javascript angular typescript amazon-web-services api


【解决方案1】:

起初,我尝试使用 crypto-browserify,但不幸的是,我遇到了与 crypto 完全相同的错误。 因此,我使用以下示例实现了自己签名的请求: https://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html

该示例适用于 python,但可以轻松适应 Javascript/Typescript。

如此处所述: https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html

我使用 crypto-js 代替 crypto,没有出现任何错误。

【讨论】:

    【解决方案2】:

    使用 npm 或 yarn npm install buffer 安装缓冲包。并将以下内容添加到 polyfills.ts() 中:

    global.Buffer = global.Buffer || require('buffer').Buffer;
    

    【讨论】:

    • 谢谢。我按照描述添加了缓冲区,但现在我收到一个错误无法读取未定义的属性“切片”。你知道如何在这里进行吗?
    • 可以粘贴一些堆栈跟踪吗?我猜你在某处将 null 传递给 aws4
    • 我在上面的问题中更新了更多的堆栈跟踪
    • 你也可以用它来导入 aws4 import * as aws4 from 'aws4';
    • 我已经相应地更新了导入,不幸的是错误没有改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2021-10-13
    • 2020-01-17
    • 1970-01-01
    • 2019-04-26
    • 2022-01-18
    • 2017-07-13
    相关资源
    最近更新 更多