Skip to content

Commit bb1ef99

Browse files
Dillon Nysdnys1
authored andcommitted
chore(auth): Clean up sign-in state machine
Gives better naming to some of the methods and adds additional logging in places.
1 parent a5cf81d commit bb1ef99

File tree

2 files changed

+41
-35
lines changed

2 files changed

+41
-35
lines changed

packages/auth/amplify_auth_cognito_dart/lib/src/state/cognito_state_machine.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,7 @@ class CognitoAuthStateMachine
125125
final authSession = await loadSession();
126126
return authSession.userPoolTokensResult.value;
127127
}
128+
129+
@override
130+
String get runtimeTypeName => 'CognitoAuthStateMachine';
128131
}

packages/auth/amplify_auth_cognito_dart/lib/src/state/machines/sign_in_state_machine.dart

Lines changed: 38 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,9 @@ final class SignInStateMachine
171171
}
172172

173173
/// Creates the `InitiateAuth` request.
174-
Future<InitiateAuthRequest> initiate(SignInInitiate event) async {
174+
Future<InitiateAuthRequest> createInitiateAuthRequest(
175+
SignInInitiate event,
176+
) async {
175177
String expectPassword() {
176178
final password = parameters.password;
177179
if (password == null) {
@@ -196,8 +198,10 @@ final class SignInStateMachine
196198
/// Creates the response to a challenge with name [challengeName] and
197199
/// parameters [challengeParameters].
198200
///
199-
/// Subclasses should return `null` if they cannot handle [challengeName].
200-
Future<RespondToAuthChallengeRequest?> respondToAuthChallenge(
201+
/// Returns `null` if the state machine cannot automatically respond given
202+
/// the [challengeName], its current state, and the current `event` being
203+
/// processed.
204+
Future<RespondToAuthChallengeRequest?> createRespondToAuthChallengeRequest(
201205
SignInEvent? event,
202206
ChallengeNameType challengeName,
203207
BuiltMap<String, String?> challengeParameters,
@@ -216,7 +220,11 @@ final class SignInStateMachine
216220
..analyticsMetadata = get<AnalyticsMetadataType>()?.toBuilder(),
217221
);
218222
}
219-
return respondToSrpChallenge(event, challengeName, challengeParameters);
223+
return createRespondToSrpChallengeRequest(
224+
event,
225+
challengeName,
226+
challengeParameters,
227+
);
220228
}
221229

222230
/// Creates the password verifier request in a worker instance.
@@ -468,7 +476,7 @@ final class SignInStateMachine
468476

469477
/// Responds to an SRP flow challenge.
470478
@protected
471-
Future<RespondToAuthChallengeRequest?> respondToSrpChallenge(
479+
Future<RespondToAuthChallengeRequest?> createRespondToSrpChallengeRequest(
472480
SignInEvent? event,
473481
ChallengeNameType challengeName,
474482
BuiltMap<String, String?> challengeParameters,
@@ -583,7 +591,10 @@ final class SignInStateMachine
583591
_user.username = event.parameters.username;
584592
await _loadDeviceSecrets();
585593

586-
var initRequest = await initiate(event);
594+
var initRequest = await createInitiateAuthRequest(event);
595+
final contextData = await contextDataProvider.buildRequestData(
596+
_user.username!,
597+
);
587598
initRequest = initRequest.rebuild((b) {
588599
b.analyticsMetadata = get<AnalyticsMetadataType>()?.toBuilder();
589600

@@ -600,19 +611,15 @@ final class SignInStateMachine
600611
if (deviceKey != null) {
601612
b.authParameters[CognitoConstants.challengeParamDeviceKey] = deviceKey;
602613
}
614+
if (contextData != null) {
615+
b.userContextData.replace(contextData);
616+
}
603617
});
618+
logger.verbose('$initRequest');
604619

605-
final contextDataProvider = this.contextDataProvider;
606-
final contextData = await contextDataProvider.buildRequestData(
607-
_user.username!,
608-
);
609-
if (contextData != null) {
610-
initRequest = initRequest.rebuild(
611-
(b) => b.userContextData.replace(contextData),
612-
);
613-
}
614620
final initResponse =
615621
await cognitoIdentityProvider.initiateAuth(initRequest).result;
622+
logger.verbose('$initResponse');
616623

617624
// Current flow state
618625
_authenticationResult = initResponse.authenticationResult;
@@ -649,7 +656,7 @@ final class SignInStateMachine
649656
.result;
650657
final requiresConfirmation = response.userConfirmationNecessary;
651658

652-
return _CreateDeviceResult(
659+
return (
653660
devicePassword: workerResult.devicePassword,
654661
deviceStatus: requiresConfirmation
655662
? DeviceRememberedStatusType.notRemembered
@@ -699,15 +706,15 @@ final class SignInStateMachine
699706
final accessToken = await _saveAuthResult(authenticationResult);
700707
final newDeviceMetadata = authenticationResult.newDeviceMetadata;
701708
if (newDeviceMetadata != null) {
702-
final createDeviceResult = await _createDevice(
709+
final (:devicePassword, :deviceStatus) = await _createDevice(
703710
accessToken,
704711
newDeviceMetadata,
705712
);
706713
_user.deviceSecrets = CognitoDeviceSecretsBuilder()
707714
..deviceGroupKey = newDeviceMetadata.deviceGroupKey
708715
..deviceKey = newDeviceMetadata.deviceKey
709-
..devicePassword = createDeviceResult.devicePassword
710-
..deviceStatus = createDeviceResult.deviceStatus;
716+
..devicePassword = devicePassword
717+
..deviceStatus = deviceStatus;
711718

712719
await getOrCreate<DeviceMetadataRepository>().put(
713720
_user.username!,
@@ -727,7 +734,7 @@ final class SignInStateMachine
727734

728735
// Query the state machine for a response given potential user input in
729736
// `event`.
730-
final respondRequest = await respondToAuthChallenge(
737+
final respondRequest = await createRespondToAuthChallengeRequest(
731738
event,
732739
_challengeName!,
733740
_challengeParameters,
@@ -764,18 +771,15 @@ final class SignInStateMachine
764771
return _respondToChallenge(event, respondRequest);
765772
}
766773

767-
/// Inner handle to send the request returned from [respondToAuthChallenge]
774+
/// Inner handle to send the request returned from [createRespondToAuthChallengeRequest]
768775
/// and process its response.
769776
Future<SignInState> _respondToChallenge(
770777
SignInEvent? event,
771778
RespondToAuthChallengeRequest respondRequest,
772779
) async {
773-
UserContextDataType? userContextData;
774-
final contextDataProvider = this.contextDataProvider;
775-
userContextData = await contextDataProvider.buildRequestData(
780+
final userContextData = await contextDataProvider.buildRequestData(
776781
_user.username!,
777782
);
778-
779783
respondRequest = respondRequest.rebuild((b) {
780784
b
781785
..session ??= _session
@@ -797,11 +801,13 @@ final class SignInStateMachine
797801
b.userContextData.replace(userContextData);
798802
}
799803
});
804+
logger.verbose('$respondRequest');
800805

801806
try {
802807
final challengeResp = await cognitoIdentityProvider
803808
.respondToAuthChallenge(respondRequest)
804809
.result;
810+
logger.verbose('$challengeResp');
805811

806812
// Update flow state
807813
_authenticationResult = challengeResp.authenticationResult;
@@ -814,12 +820,14 @@ final class SignInStateMachine
814820
// For device flows, retry with normal SRP sign-in when the device is not
815821
// found. This protects against the case where a device has been removed
816822
// in Cognito but exists in the local cache.
823+
logger.debug('Received ResourceNotFoundException during device flow');
817824
if (_challengeName == ChallengeNameType.passwordVerifier &&
818825
_user.deviceSecrets != null) {
826+
logger.debug('Retrying without device secrets');
819827
_user.deviceSecrets = null;
820828
await getOrCreate<DeviceMetadataRepository>().remove(_user.username!);
821829

822-
final respondRequest = await respondToAuthChallenge(
830+
final respondRequest = await createRespondToAuthChallengeRequest(
823831
event,
824832
_challengeName!,
825833
_challengeParameters,
@@ -886,12 +894,7 @@ final class SignInStateMachine
886894
}
887895
}
888896

889-
class _CreateDeviceResult {
890-
const _CreateDeviceResult({
891-
required this.devicePassword,
892-
required this.deviceStatus,
893-
});
894-
895-
final String devicePassword;
896-
final DeviceRememberedStatusType deviceStatus;
897-
}
897+
typedef _CreateDeviceResult = ({
898+
String devicePassword,
899+
DeviceRememberedStatusType deviceStatus,
900+
});

0 commit comments

Comments
 (0)