-
Notifications
You must be signed in to change notification settings - Fork 2.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(clients): Add signing middleware #11323
feat(clients): Add signing middleware #11323
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Makes sense to me, one comment
let response: HttpResponse; | ||
const { credentials, region, service } = signingOptions; | ||
if (signingOptions.systemClockOffset == null) { | ||
signingOptions.systemClockOffset = 0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Instead of mutating the parameters, I wonder if we could just have a variable in the signingMiddleware
closure that can keep track of this? Ditto below where you're updating based on server errors. This would also let us de-structure systemClockOffset
like the other options.
signingOptions.systemClockOffset | ||
); | ||
} | ||
throw error; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I get why this exists, but is it guaranteed that the retry middleware will always come first in the chain? Just dropping a comment so Allan can confirm.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's not technically guaranteed that the retry middleware will always come first in the chain - it is up to the order of the handler composition. In the case of APIs which require signing, I think we can pre-define a handler with the retry middleware coming first.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks a lot for this change!🤟 I only have some minor comments.
packages/core/src/clients/middleware/signing/utils/isClockSkewed.ts
Outdated
Show resolved
Hide resolved
packages/core/src/clients/middleware/signing/utils/getUpdatedSystemClockOffset.ts
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🚀
e3a3936
to
554d0cb
Compare
* chore(core): bump to ts 5.0 (#11077) * feat(clients): basic types and fetch handler (#11120) * feat(clients): compose transfer handler with middleware & retry middleware (#11188) * feat(clients): middleware interface and retry middleware * test(clients): retry middleare unit test * fix(clients): middleware type to include options * feat(clients): add retry middleware unit test and update interface * chore(clients): update bundle size limit for fetch and retry * chore(clients): add retry docs; fix format * fix(clients): address feedbacks * fix(retry): add metadata to returns from retry middldeware (#11212) * fix(retry): add metadata to returns from retry middldeware; fix minor bugs * feat(clients): address retry middleware feedbacks Co-authored-by: Chris F <5827964+cshfang@users.noreply.github.com> * chore(core): update size limit * feat(clients): cognito identity client (#11213) * feat(clients): implement service API composer * chore(clients): rename middleware interface * feat(clients): middleware handler interface can be non request/response interface * chore(clients): move fetch handler to handlers folder * feat(clients): implement user agent middleware * feat(clients): implement unauth aws transfer handler * feat(clients): implement api handler composer * feat(clients): implement cognito-identity client * chore(clients): update bundle size limit * feat(clients): add serde utils; remove retry in api handler composer * feat(clients): integrate cognito-identity client to Credentials class * fix(clients): make retryDecider interface async * chore: move cognito client to dev dep * chore(clients): use Pascale path name * fix(clients): handle fetch response.body undefined in RN * chore: publish under v5-custom-clients dist-tag * fix(clients): read body once for errors * chore(clients): enable tagged release of custom clients (#11267) * test(clients): add functional test to cognito identity client (#11266) * test(clients): add cognito-identity functional test * chore(clients): prefer destructuring parameters at top * feat(clients): add useragent to cognito identity (#11269) * chore(clients): add license header to files (#11292) * feat(clients): Add custom signature v4 signer (#11273) * feat(clients): Add custom signature v4 signer * Updated docstrings * Extracted common code * Use == null instead of isNil * Add unit tests * Add missing licensing headers * Use test case options in presign tests * Fixed comment * Add test for data hashing with SourceData keys * Remove buffer dependency * Remove internal sdk dependency * chore(clients): Make signing functions synchronous (#11307) * chore(clients): Replace existing Signer implementation (#11310) * chore(clients): Add @internal annotation (#11320) * feat(clients): Add signing middleware (#11323) * feat(clients): Add signing middleware * Use closure for clock offset * Add bundle size test entry * Address comments * feat(clients): support CN partition by adding DNS suffix resolver (#11311) * feat(clients): support CN partition by adding DNS suffix resolver * chore(clients): update bundle size test limit * fix(clients): address feedbacks * chore: update bundle size limit * chore(clients): Add context to some regex (#11334) * feat(clients) Add updateEndpoint API (#11330) * feat(clients) Add updateEndpoint API * Rename handler * chore(clients): Use DNS suffix util in Pinpoint client (#11340) * chore(clients): Annotate custom client APIs with @internal (#11347) * feat(clients) Add putEvents API (#11342) * feat(clients) Add putEvents API * Add additional verification for expected date format * Mark API as internal * feat(clients) Add getInAppMessages API (#11348) * feat(clients) Add getInAppMessages API * Update unit test * chore(clients): Replace SDK Pinpoint Client (#11359) Co-authored-by: Allan Zheng <zheallan@amazon.com> * chore: update size limit * chore(clients): export pinpoint client from internal subpath (#11369) * feat(clients): allow fetch handler to read body multiple times * chore: update size limit * fix(clients): add react-native entrypoint for internal modules * chore: address feedbacks * feat(clients): vendor TS types from pinpoint and cognito-identity clients (#11393) * chore: dts bundler script for AWS SDK types * feat(clients): vendor AWS SDK client types * chore: workaround the tslint errors for generated rollup types * docs: add readme to build clients script * feat: update SDK types * chore(storage): update size limit (#11406) * fix(clients): middleware chain revert after every invocation (#11432) * chore: prepare for release; split out data packages diffs * fix: address feedbacks * fix(analytics): apply useragent enhancement to pinpoint client * chore: update size limit * fix: Auth bundle size test * fix: Update bundle size for pubsub * fix: api-graphql bundle size update * fix: Update api bundle sizes * fix: DataStore bundle size test --------- Co-authored-by: Chris F <5827964+cshfang@users.noreply.github.com> Co-authored-by: Aaron S <94858815+stocaaro@users.noreply.github.com>
Description of changes
This PR adds a signing middleware to be used with custom clients when composing functional APIs.
Description of how you validated changes
Added unit tests and
yarn test
Also tested by creating a Pinpoint API locally which requires signing and validating that requests through the API were being signed.
Checklist
yarn test
passesBy submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.