Skip to content
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

chore(auth): add email otp mfa enums and types #5237

Open
wants to merge 25 commits into
base: feat/email-otp-mfa
Choose a base branch
from

Conversation

khatruong2009
Copy link
Member

@khatruong2009 khatruong2009 commented Aug 2, 2024

Issue #, if available:

Description of changes:

  • add enum types for email mfa code
  • regenerate auth SDKs
  • add signInSteps
  • add SDK bridge and plugin implementations

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

@khatruong2009 khatruong2009 marked this pull request as ready for review August 5, 2024 16:43
@khatruong2009 khatruong2009 requested a review from a team as a code owner August 5, 2024 16:43
Equartey
Equartey previously approved these changes Aug 6, 2024
Jordan-Nelson
Jordan-Nelson previously approved these changes Aug 14, 2024
@khatruong2009 khatruong2009 changed the base branch from feat/email-otp-mfa to feat/email-mfa September 18, 2024 16:08
@khatruong2009 khatruong2009 changed the base branch from feat/email-mfa to feat/email-otp-mfa September 18, 2024 16:12
khatruong2009 and others added 15 commits September 18, 2024 09:16
* chore(api): update endpoint config to use ApiOutputs instead of AWSApiConfig type (#5193)

* feat: bump json_annotation dependency to v4.9

* chore: update actions workflow to run aft link

* chore(secure_storage): Plugin Endorsement (#5208)

* chore(infra): bump deps (#5221)

* chore(test): use Amplify Gen 2 config in unit tests (#5205)

* chore: add testUrlScheme back to test (#5223)

* chore: add gen2 auth e2e infra (#5179)

* chore(infra): Api migrate to Gen 2 E2E

* fix: git update-index --chmod=+x

* fix: code review

* chore: port auth backend

* chore: port lambda triggers for create user and custom email sender

* chore: move utils to infra-common

* chore: compile infra common to js

* chore: update utils for js restructure, add missing deps

* chore: fix confirmation code infra

* chore: update tests to run for gen2 stacks

* chore: remove alias from custom sender lambda

* chore: fix deliveryMedium in reset password test

* chore: add phone sign in infra

* chore: rename email-sign-in

* chore: add license header

* chore: fix formatting in GH workflow

* chore: update package-lock

* chore: remove deleted file

* chore: fix formatting

* chore: update package lock

* chore: remove dup function

* chore: remove changes from merge conflicts

* chore: fix build script

* chore: fetch auth amplify_outputs

* chore: remove libgit2dart

* chore: add custom sms sender

* chore: add stack name to infra resources

* chore: pull gen2 backend for authenticator

* chore: update package-lock

* chore: move dependencies to dev_dependencies

* chore: update fetch auth session tests

* chore: separate reset pw and confirmation delivery medium

* chore: fix hanging test

* chore: rename test group

* chore: update comments, remove unused type

* chore: update package lock

---------

Co-authored-by: Elijah Quartey <[email protected]>

* chore(auth): sign-up state machine to use AmplifyOutputs instead of AmplifyConfig types (#5230)

* chore(auth): sign-in state machine to use AmplifyOutputs instead of AmplifyConfig types (#5231)

* chore(auth): fetch auth session state machine to use AmplifyOutputs instead of AmplifyConfig types (#5234)

* chore(auth): sign-out state machine to use AmplifyOutputs instead of AmplifConfig types (#5235)

* chore(actions): android emulator to start with clear cache and data (#5245)

* chore(actions): e2e android tests to run with API 34 (#5247)

* chore(infra): bump deps (#5246)

Updated
@aws-sdk/client-amplify
@aws-sdk/client-cognito-identity-provider
@aws-crypto/client-node
@aws-sdk/client-s3

* chore(auth): cognito keys to not use AmplifyConfig types (#5243)

* chore(auth): hosted ui state machine to not use AmplifyConfig types (#5254)

* fix(datastore): Clear subscriptions on Stop (#5253)

* Chore/goldens flutter lint (#5271)

* temp: generate goldens png

* test: fixing context mounted issue

* chore: add todo comment about deprecated member use

---------

Co-authored-by: Andrew Hahn <[email protected]>

* chore(infra): analytics integ test gen 2 backend (#5104)

* chore(auth): device metadata repository to use AuthOutputs instead of CognitoUserPoolConfig (#5289)

* feat(Auth): Add fetchCurrentDevice API (#5251)

feat(Auth): Add fetchCurrentDevice API (#5251)

* chore(dependencies): bump package_info_plus (#5274)

chore: bump package_info_plus

* chore: migrate sms only MFA infra to Gen 2 (#5291)

* chore: add new auth backend

* chore: add auth extension

* chore: add license headers

* chore: add mfa to env

* chore: add trigger to enable MFA

* chore: add infra for sms required

* chore: refactor tests for gen 2 backends

* chore: add backends to deploy script

* chore: package-lock for mfa-required-sms

* chore: remove bundling of @aws-crypto/client-node

* chore: fix formatting

* fix(datastore): Restart Sync Engine when network on/off (#5218)

* chore: update authenticator tests (#5296)

* chore(auth): hosted ui platforms to use AmplifyOutputs types instead of AmplifyConfig (#5273)

* chore(auth): asf context data provider to use AuthOutputs instead of CognitoUserPoolConfig (#5290)

* chore(auth): fix fetch current device test (#5297)

* fix: push notification flush events (#5215)

fix: push notification flush events (#5215)

* chore(dependencies): bump build_runner (#5300)

* chore(dependencies): bump build_runner

* chore(bump): checks package (#5305)

* chore(bump): checks package

* chore(version): Bump version

chore(): Fixed Version Bumps

chore: fixed change log

chore: fixed change log

chore: fixed change log

chore: fixed change log

* chore: manually bump amplify_db_common version

* chore(infra): Extend API key expiration (#5336)

* chore(dev): use ubuntu image from amazon ECR public gallery instead of docket hub (#5341)

* fix(api): web socket error handling (#5359)

* chore: update issue template (#5369)

* fix(datastore): FlutterSerializedModel.extractJsonValue returns `.some(nil)` instead of `nil` (#5370)

* chore: add GH actions for issue open, close, comment, label events (#5310)

* fix(secure_storage): add missing macOS plugin (#5372)

fix(secure_storage): add missing macos plugin

it's fixing #5361

* chore: update plugin registrant for example apps that depend on secure storage (#5379)

* chore(version): Bump version

- fix(secure_storage): add missing macOS plugin ([#5372](#5372))

Updated-Components: Secure Storage

* chore(deps): Amplify Android 2.21.1 (#5376)

* update amplify android to latest

* update amplify android to latest in notifications

* feat(aws_common): Generated new AWSService constructors (#5378)

* chore(infra): regen lock file (#5374)

* chore(auth): credential store state machine to use AuthOutputs instead of AmplifyConfig types (#5298)

* chore(api): Remove Gen 1 API backend (#5393)

* chore(datastore): Add multi auth integration tests (#5204)

* feat: move App Sync subscription headers to protocol (#5301)

* chore: move subscription headers to protocol

* fix: remove `=` from encoded headers

* chore: add comment

* chore: `aft version-bump` test suite (#5424)

* chore: add `--skip-build-version` option

* chore: use `base-ref`/`head-ref` over env vars

* chore: add new version bump test suite

* chore: remove old version bump tests

* chore: only include first change log entry

* fix: sort change types before writing to the change log

* chore: remove non essential info from diffs

* chore: generate repo snapshot

* chore: generate diff snapshots

* chore: clean up tests and test output

* chore: update `aft generate workflows`, regenerate dependabot.yaml (#5441)

* chore: skip repo snapshot in dependabot generation

* chore: regenerate dependabot.yaml

* chore: fix `aft version-bump` (#5436)

* fix: properly handle component propagation

* chore: add test for multi package update with breaking common package

---------

Co-authored-by: NikaHsn <[email protected]>
Co-authored-by: Jordan Nelson <[email protected]>
Co-authored-by: Elijah Quartey <[email protected]>
Co-authored-by: Elijah Quartey <[email protected]>
Co-authored-by: Tyler-Larkin <[email protected]>
Co-authored-by: Andrew Hahn <[email protected]>
Co-authored-by: Andrew Hahn <[email protected]>
Co-authored-by: Burak Karahan <[email protected]>
Co-authored-by: Jamil Saadeh <[email protected]>
* chore(api): update endpoint config to use ApiOutputs instead of AWSApiConfig type (#5193)

* feat: bump json_annotation dependency to v4.9

* chore: update actions workflow to run aft link

* chore(secure_storage): Plugin Endorsement (#5208)

* chore(infra): bump deps (#5221)

* chore(test): use Amplify Gen 2 config in unit tests (#5205)

* chore: add testUrlScheme back to test (#5223)

* chore: add gen2 auth e2e infra (#5179)

* chore(infra): Api migrate to Gen 2 E2E

* fix: git update-index --chmod=+x

* fix: code review

* chore: port auth backend

* chore: port lambda triggers for create user and custom email sender

* chore: move utils to infra-common

* chore: compile infra common to js

* chore: update utils for js restructure, add missing deps

* chore: fix confirmation code infra

* chore: update tests to run for gen2 stacks

* chore: remove alias from custom sender lambda

* chore: fix deliveryMedium in reset password test

* chore: add phone sign in infra

* chore: rename email-sign-in

* chore: add license header

* chore: fix formatting in GH workflow

* chore: update package-lock

* chore: remove deleted file

* chore: fix formatting

* chore: update package lock

* chore: remove dup function

* chore: remove changes from merge conflicts

* chore: fix build script

* chore: fetch auth amplify_outputs

* chore: remove libgit2dart

* chore: add custom sms sender

* chore: add stack name to infra resources

* chore: pull gen2 backend for authenticator

* chore: update package-lock

* chore: move dependencies to dev_dependencies

* chore: update fetch auth session tests

* chore: separate reset pw and confirmation delivery medium

* chore: fix hanging test

* chore: rename test group

* chore: update comments, remove unused type

* chore: update package lock

---------

Co-authored-by: Elijah Quartey <[email protected]>

* chore(auth): sign-up state machine to use AmplifyOutputs instead of AmplifyConfig types (#5230)

* chore(auth): sign-in state machine to use AmplifyOutputs instead of AmplifyConfig types (#5231)

* chore(auth): fetch auth session state machine to use AmplifyOutputs instead of AmplifyConfig types (#5234)

* chore(auth): sign-out state machine to use AmplifyOutputs instead of AmplifConfig types (#5235)

* chore(actions): android emulator to start with clear cache and data (#5245)

* chore(actions): e2e android tests to run with API 34 (#5247)

* chore(infra): bump deps (#5246)

Updated
@aws-sdk/client-amplify
@aws-sdk/client-cognito-identity-provider
@aws-crypto/client-node
@aws-sdk/client-s3

* chore(auth): cognito keys to not use AmplifyConfig types (#5243)

* chore(auth): hosted ui state machine to not use AmplifyConfig types (#5254)

* fix(datastore): Clear subscriptions on Stop (#5253)

* Chore/goldens flutter lint (#5271)

* temp: generate goldens png

* test: fixing context mounted issue

* chore: add todo comment about deprecated member use

---------

Co-authored-by: Andrew Hahn <[email protected]>

* chore(infra): analytics integ test gen 2 backend (#5104)

* chore(auth): device metadata repository to use AuthOutputs instead of CognitoUserPoolConfig (#5289)

* feat(Auth): Add fetchCurrentDevice API (#5251)

feat(Auth): Add fetchCurrentDevice API (#5251)

* chore(dependencies): bump package_info_plus (#5274)

chore: bump package_info_plus

* chore: migrate sms only MFA infra to Gen 2 (#5291)

* chore: add new auth backend

* chore: add auth extension

* chore: add license headers

* chore: add mfa to env

* chore: add trigger to enable MFA

* chore: add infra for sms required

* chore: refactor tests for gen 2 backends

* chore: add backends to deploy script

* chore: package-lock for mfa-required-sms

* chore: remove bundling of @aws-crypto/client-node

* chore: fix formatting

* fix(datastore): Restart Sync Engine when network on/off (#5218)

* chore: update authenticator tests (#5296)

* chore(auth): hosted ui platforms to use AmplifyOutputs types instead of AmplifyConfig (#5273)

* chore(auth): asf context data provider to use AuthOutputs instead of CognitoUserPoolConfig (#5290)

* chore(auth): fix fetch current device test (#5297)

* fix: push notification flush events (#5215)

fix: push notification flush events (#5215)

* chore(dependencies): bump build_runner (#5300)

* chore(dependencies): bump build_runner

* chore(bump): checks package (#5305)

* chore(bump): checks package

* chore(version): Bump version

chore(): Fixed Version Bumps

chore: fixed change log

chore: fixed change log

chore: fixed change log

chore: fixed change log

* chore: manually bump amplify_db_common version

* chore(infra): Extend API key expiration (#5336)

* chore(dev): use ubuntu image from amazon ECR public gallery instead of docket hub (#5341)

* fix(api): web socket error handling (#5359)

* chore: update issue template (#5369)

* fix(datastore): FlutterSerializedModel.extractJsonValue returns `.some(nil)` instead of `nil` (#5370)

* chore: add GH actions for issue open, close, comment, label events (#5310)

* fix(secure_storage): add missing macOS plugin (#5372)

fix(secure_storage): add missing macos plugin

it's fixing #5361

* chore: update plugin registrant for example apps that depend on secure storage (#5379)

* chore(version): Bump version

### Fixes
- fix(secure_storage): add missing macOS plugin ([#5372](#5372))

Updated-Components: Secure Storage

* chore(deps): Amplify Android 2.21.1 (#5376)

* update amplify android to latest

* update amplify android to latest in notifications

* feat(aws_common): Generated new AWSService constructors (#5378)

* chore(infra): regen lock file (#5374)

* chore(auth): credential store state machine to use AuthOutputs instead of AmplifyConfig types (#5298)

* chore(api): Remove Gen 1 API backend (#5393)

* chore(datastore): Add multi auth integration tests (#5204)

* feat: move App Sync subscription headers to protocol (#5301)

* chore: move subscription headers to protocol

* fix: remove `=` from encoded headers

* chore: add comment

* chore: `aft version-bump` test suite (#5424)

* chore: add `--skip-build-version` option

* chore: use `base-ref`/`head-ref` over env vars

* chore: add new version bump test suite

* chore: remove old version bump tests

* chore: only include first change log entry

* fix: sort change types before writing to the change log

* chore: remove non essential info from diffs

* chore: generate repo snapshot

* chore: generate diff snapshots

* chore: clean up tests and test output

* chore: update `aft generate workflows`, regenerate dependabot.yaml (#5441)

* chore: skip repo snapshot in dependabot generation

* chore: regenerate dependabot.yaml

* chore: fix `aft version-bump` (#5436)

* fix: properly handle component propagation

* chore: add test for multi package update with breaking common package

* chore(auth): re-generate auth cognito sdk for email mfa

---------

Co-authored-by: Jordan Nelson <[email protected]>
Co-authored-by: Elijah Quartey <[email protected]>
Co-authored-by: Elijah Quartey <[email protected]>
Co-authored-by: Tyler-Larkin <[email protected]>
Co-authored-by: Andrew Hahn <[email protected]>
Co-authored-by: Kha Truong <[email protected]>
Co-authored-by: Andrew Hahn <[email protected]>
Co-authored-by: Burak Karahan <[email protected]>
Co-authored-by: Jamil Saadeh <[email protected]>
Co-authored-by: Nika Hassani <[email protected]>
@Equartey Equartey self-requested a review September 19, 2024 13:54
@@ -792,90 +794,100 @@ extension MfaSettings on CognitoIdentityProviderClient {

/// Sets the MFA settings for the user.
Future<void> setMfaSettings({
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

refactor: This logic can be reordered and reduced to improve readability. Look at my refactor below. While it could be simplified more, I believe this captures the concept of merging logic and maintaining a linear flow. Also I recommend testing/verifying its functionality with unit tests.

/// Sets the MFA settings for the user.
Future<void> setMfaSettings({
  required String accessToken,
  MfaPreference? sms,
  MfaPreference? totp,
  MfaPreference? email,
}) async {
  final UserMfaPreference(
    enabled: currentEnabled,
    preferred: currentPreference,
  ) = await _getRawUserSettings(accessToken: accessToken);

  final newPreferredMethods = [
    if (sms == MfaPreference.preferred) MfaType.sms,
    if (totp == MfaPreference.preferred) MfaType.totp,
    if (email == MfaPreference.preferred) MfaType.email,
  ];

  if (newPreferredMethods.length > 1) {
    throw const InvalidParameterException(
      'Cannot assign multiple MFA methods as preferred',
    );
  }

  MfaType? preferred = newPreferredMethods.isNotEmpty 
      ? newPreferredMethods.first 
      : currentPreference;

  final isCurrentPreferenceDisabled = switch (currentPreference) {
    MfaType.sms => sms == MfaPreference.disabled || sms == MfaPreference.notPreferred,
    MfaType.totp => totp == MfaPreference.disabled || totp == MfaPreference.notPreferred,
    MfaType.email => email == MfaPreference.disabled || email == MfaPreference.notPreferred,
    _ => false,
  };
  preferred = isCurrentPreferenceDisabled ? null : preferred;

  const enabledValues = [
    MfaPreference.enabled,
    MfaPreference.notPreferred,
    MfaPreference.preferred,
  ];

  bool isMfaEnabled(MfaType mfaType, MfaPreference? preference) {
    if (preference == MfaPreference.disabled) return false;
    return currentEnabled.contains(mfaType) || enabledValues.contains(preference);
  }

  final smsMfaSettings = SmsMfaSettingsType(
    enabled: isMfaEnabled(MfaType.sms, sms),
    preferredMfa: preferred == MfaType.sms,
  );
  final softwareTokenSettings = SoftwareTokenMfaSettingsType(
    enabled: isMfaEnabled(MfaType.totp, totp),
    preferredMfa: preferred == MfaType.totp,
  );
  final emailMfaSettings = EmailMfaSettingsType(
    enabled: isMfaEnabled(MfaType.email, email),
    preferredMfa: preferred == MfaType.email,
  );

  await setUserMfaPreference(
    SetUserMfaPreferenceRequest(
      accessToken: accessToken,
      smsMfaSettings: smsMfaSettings,
      softwareTokenMfaSettings: softwareTokenSettings,
      emailMfaSettings: emailMfaSettings,
    ),
  ).result;
}

@Equartey Equartey removed the request for review from Jordan-Nelson September 20, 2024 14:01
@Equartey Equartey dismissed stale reviews from Jordan-Nelson and themself September 20, 2024 14:03

new changes

@@ -57,6 +57,9 @@ abstract class CognitoConstants {
/// The `SMS_MFA_CODE` parameter.
static const challengeParamSmsMfaCode = 'SMS_MFA_CODE';

/// The `EMAIL_OTP_CODE` parameter.
static const challengeParamEmailMfaCode = 'EMAIL_OTP_CODE';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Q: should this be 'EMAIL_MFA_CODE'?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is to match the Cognito team renaming it to EMAIL_OTP rather than MFA.

@@ -74,6 +74,7 @@

## Generated SDK files
packages/**/lib/src/sdk/src/** linguist-generated
packages/auth/amplify_auth_cognito_dart/lib/src/sdk/sdk_exception.dart linguist-generated
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Q: why do we need to add this?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The file is generated but doesn't have the .g.dart at the end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants