javascript - Angular'da AWS İmzalı İstekler Oluşturma


Angular 8 uygulamamdaki bir REST uç noktasını çağırmak istiyorum; bu uç nokta AWS API Gateway üzerinde barındırılıyor. Uç noktanın yetkilendirmesi AWS_IAM, yani isteğin imzalanması gerekiyor.

Angular'da imzalı istek nasıl yapılabilir? JavaScript için popüler bir paket olan aws4 (https://www.npmjs.com/package/aws4) benim tercih edeceğim seçenek olurdu. Ancak, bu JS paketini Angular uygulamamda kullanamıyorum. Şöyle yaptım:

  1. Angular proje klasöründe npm install aws4
  2. import * as aws4 from '../../../node_modules/aws4/aws4.js'; benim api.service.ts dosyamda (bu, API'leri çağırmak için kullanılan Angular servisidir).

API hizmetimden imza yöntemini kullanırken

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

Aşağıdaki hatayı alıyorum:

Yakalanmamış ReferenceError: Buffer tanımlı değil Object../node_modules/core-util-is/lib/util.js içinde _webpack_require_

Ayrıca, API servisinizde import etmek yerine declare var aws4: any kullanmayı denedim, ancak her zaman yukarıdaki hatayı alıyorum.

aws4 paketi Angular 8'e nasıl ithal edilebilir veya alternatif olarak, Angular 8 uygulamasında her adımı uygulamadan AWS için imzalı istekler nasıl oluşturulabilir (yani bir kütüphane kullanmak istiyorum).

Güncelleme: Buffer ekledikten sonra şu hatayı alıyorum:

Yakalanmamış TypeError: Tanımsız 'slice' özelliği okunamıyor at Object../node_modules/readable-stream/lib/_stream_writable.js (_stream_writable.js:57) at webpack_require (bootstrap:79) at Object../node_modules/readable-stream/readable-browser.js (readable-browser.js:4) at webpack_require (bootstrap:79) at Object../node_modules/stream-browserify/index.js (index.js:28) at webpack_require (bootstrap:79) at Object../node_modules/hash-base/index.js (index.js:3) at webpack_require (bootstrap:79) at Object../node_modules/md5.js/index.js (index.js:3) at webpack_require (bootstrap:79)

Cevap #1

İlk başta crypto-browserify kullanmayı denedim, ama ne yazık ki, crypto ile aldığımla tamamen aynı hatayı aldım. Bu nedenle, isteği imzalamayı kendim aşağıdaki örneği kullanarak uyguladım: https://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html

Örnek Python içindir, ancak kolayca Javascript/Typescript için uyarlanabilir.

Burada açıklandığı gibi: https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html

crypto yerine crypto-js kullandım ve hiç hata almadım.

Cevap #2

npm veya yarn kullanarak buffer paketini yükleyin npm install buffer. Ve polyfills.ts içine aşağıdakileri ekleyin():

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