@@ -171,7 +171,9 @@ final class SignInStateMachine
171
171
}
172
172
173
173
/// Creates the `InitiateAuth` request.
174
- Future <InitiateAuthRequest > initiate (SignInInitiate event) async {
174
+ Future <InitiateAuthRequest > createInitiateAuthRequest (
175
+ SignInInitiate event,
176
+ ) async {
175
177
String expectPassword () {
176
178
final password = parameters.password;
177
179
if (password == null ) {
@@ -196,8 +198,10 @@ final class SignInStateMachine
196
198
/// Creates the response to a challenge with name [challengeName] and
197
199
/// parameters [challengeParameters] .
198
200
///
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 (
201
205
SignInEvent ? event,
202
206
ChallengeNameType challengeName,
203
207
BuiltMap <String , String ?> challengeParameters,
@@ -216,7 +220,11 @@ final class SignInStateMachine
216
220
..analyticsMetadata = get <AnalyticsMetadataType >()? .toBuilder (),
217
221
);
218
222
}
219
- return respondToSrpChallenge (event, challengeName, challengeParameters);
223
+ return createRespondToSrpChallengeRequest (
224
+ event,
225
+ challengeName,
226
+ challengeParameters,
227
+ );
220
228
}
221
229
222
230
/// Creates the password verifier request in a worker instance.
@@ -468,7 +476,7 @@ final class SignInStateMachine
468
476
469
477
/// Responds to an SRP flow challenge.
470
478
@protected
471
- Future <RespondToAuthChallengeRequest ?> respondToSrpChallenge (
479
+ Future <RespondToAuthChallengeRequest ?> createRespondToSrpChallengeRequest (
472
480
SignInEvent ? event,
473
481
ChallengeNameType challengeName,
474
482
BuiltMap <String , String ?> challengeParameters,
@@ -583,7 +591,10 @@ final class SignInStateMachine
583
591
_user.username = event.parameters.username;
584
592
await _loadDeviceSecrets ();
585
593
586
- var initRequest = await initiate (event);
594
+ var initRequest = await createInitiateAuthRequest (event);
595
+ final contextData = await contextDataProvider.buildRequestData (
596
+ _user.username! ,
597
+ );
587
598
initRequest = initRequest.rebuild ((b) {
588
599
b.analyticsMetadata = get <AnalyticsMetadataType >()? .toBuilder ();
589
600
@@ -600,19 +611,15 @@ final class SignInStateMachine
600
611
if (deviceKey != null ) {
601
612
b.authParameters[CognitoConstants .challengeParamDeviceKey] = deviceKey;
602
613
}
614
+ if (contextData != null ) {
615
+ b.userContextData.replace (contextData);
616
+ }
603
617
});
618
+ logger.verbose ('$initRequest ' );
604
619
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
- }
614
620
final initResponse =
615
621
await cognitoIdentityProvider.initiateAuth (initRequest).result;
622
+ logger.verbose ('$initResponse ' );
616
623
617
624
// Current flow state
618
625
_authenticationResult = initResponse.authenticationResult;
@@ -649,7 +656,7 @@ final class SignInStateMachine
649
656
.result;
650
657
final requiresConfirmation = response.userConfirmationNecessary;
651
658
652
- return _CreateDeviceResult (
659
+ return (
653
660
devicePassword: workerResult.devicePassword,
654
661
deviceStatus: requiresConfirmation
655
662
? DeviceRememberedStatusType .notRemembered
@@ -699,15 +706,15 @@ final class SignInStateMachine
699
706
final accessToken = await _saveAuthResult (authenticationResult);
700
707
final newDeviceMetadata = authenticationResult.newDeviceMetadata;
701
708
if (newDeviceMetadata != null ) {
702
- final createDeviceResult = await _createDevice (
709
+ final ( : devicePassword, : deviceStatus) = await _createDevice (
703
710
accessToken,
704
711
newDeviceMetadata,
705
712
);
706
713
_user.deviceSecrets = CognitoDeviceSecretsBuilder ()
707
714
..deviceGroupKey = newDeviceMetadata.deviceGroupKey
708
715
..deviceKey = newDeviceMetadata.deviceKey
709
- ..devicePassword = createDeviceResult. devicePassword
710
- ..deviceStatus = createDeviceResult. deviceStatus;
716
+ ..devicePassword = devicePassword
717
+ ..deviceStatus = deviceStatus;
711
718
712
719
await getOrCreate <DeviceMetadataRepository >().put (
713
720
_user.username! ,
@@ -727,7 +734,7 @@ final class SignInStateMachine
727
734
728
735
// Query the state machine for a response given potential user input in
729
736
// `event`.
730
- final respondRequest = await respondToAuthChallenge (
737
+ final respondRequest = await createRespondToAuthChallengeRequest (
731
738
event,
732
739
_challengeName! ,
733
740
_challengeParameters,
@@ -764,18 +771,15 @@ final class SignInStateMachine
764
771
return _respondToChallenge (event, respondRequest);
765
772
}
766
773
767
- /// Inner handle to send the request returned from [respondToAuthChallenge ]
774
+ /// Inner handle to send the request returned from [createRespondToAuthChallengeRequest ]
768
775
/// and process its response.
769
776
Future <SignInState > _respondToChallenge (
770
777
SignInEvent ? event,
771
778
RespondToAuthChallengeRequest respondRequest,
772
779
) async {
773
- UserContextDataType ? userContextData;
774
- final contextDataProvider = this .contextDataProvider;
775
- userContextData = await contextDataProvider.buildRequestData (
780
+ final userContextData = await contextDataProvider.buildRequestData (
776
781
_user.username! ,
777
782
);
778
-
779
783
respondRequest = respondRequest.rebuild ((b) {
780
784
b
781
785
..session ?? = _session
@@ -797,11 +801,13 @@ final class SignInStateMachine
797
801
b.userContextData.replace (userContextData);
798
802
}
799
803
});
804
+ logger.verbose ('$respondRequest ' );
800
805
801
806
try {
802
807
final challengeResp = await cognitoIdentityProvider
803
808
.respondToAuthChallenge (respondRequest)
804
809
.result;
810
+ logger.verbose ('$challengeResp ' );
805
811
806
812
// Update flow state
807
813
_authenticationResult = challengeResp.authenticationResult;
@@ -814,12 +820,14 @@ final class SignInStateMachine
814
820
// For device flows, retry with normal SRP sign-in when the device is not
815
821
// found. This protects against the case where a device has been removed
816
822
// in Cognito but exists in the local cache.
823
+ logger.debug ('Received ResourceNotFoundException during device flow' );
817
824
if (_challengeName == ChallengeNameType .passwordVerifier &&
818
825
_user.deviceSecrets != null ) {
826
+ logger.debug ('Retrying without device secrets' );
819
827
_user.deviceSecrets = null ;
820
828
await getOrCreate <DeviceMetadataRepository >().remove (_user.username! );
821
829
822
- final respondRequest = await respondToAuthChallenge (
830
+ final respondRequest = await createRespondToAuthChallengeRequest (
823
831
event,
824
832
_challengeName! ,
825
833
_challengeParameters,
@@ -886,12 +894,7 @@ final class SignInStateMachine
886
894
}
887
895
}
888
896
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