Skip to content

Commit 8f1ff46

Browse files
authored
fix(Auth): Pass client metadata to password verifier during SRP sign in (#2986)
1 parent 827f059 commit 8f1ff46

File tree

10 files changed

+73
-41
lines changed

10 files changed

+73
-41
lines changed

AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignIn/SRPAuth/InitiateAuthSRP.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ struct InitiateAuthSRP: Action {
104104
parameters: parameters)
105105
return SignInEvent(eventType: .receivedChallenge(respondToAuthChallenge))
106106
}
107-
return SignInEvent(eventType: .respondPasswordVerifier(srpStateData, response))
107+
return SignInEvent(eventType: .respondPasswordVerifier(srpStateData, response, clientMetadata))
108108
}
109109
}
110110

AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignIn/SRPAuth/VerifyPasswordSRP.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ struct VerifyPasswordSRP: Action {
1414

1515
let stateData: SRPStateData
1616
let authResponse: InitiateAuthOutputResponse
17+
let clientMetadata: ClientMetadata
1718

1819
init(stateData: SRPStateData,
19-
authResponse: InitiateAuthOutputResponse) {
20+
authResponse: InitiateAuthOutputResponse,
21+
clientMetadata: ClientMetadata) {
2022
self.stateData = stateData
2123
self.authResponse = authResponse
24+
self.clientMetadata = clientMetadata
2225
}
2326

2427
func execute(withDispatcher dispatcher: EventDispatcher,
@@ -60,6 +63,7 @@ struct VerifyPasswordSRP: Action {
6063
session: authResponse.session,
6164
secretBlock: secretBlockString,
6265
signature: signature,
66+
clientMetadata: clientMetadata,
6367
deviceMetadata: deviceMetadata,
6468
asfDeviceId: asfDeviceId,
6569
environment: userPoolEnv)
@@ -83,7 +87,7 @@ struct VerifyPasswordSRP: Action {
8387
logVerbose("\(#fileID) Received device not found \(error)", environment: environment)
8488
// Remove the saved device details and retry password verify
8589
await DeviceMetadataHelper.removeDeviceMetaData(for: username, with: environment)
86-
let event = SignInEvent(eventType: .retryRespondPasswordVerifier(stateData, authResponse))
90+
let event = SignInEvent(eventType: .retryRespondPasswordVerifier(stateData, authResponse, clientMetadata))
8791
logVerbose("\(#fileID) Sending event \(event)",
8892
environment: environment)
8993
await dispatcher.send(event)

AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/StateMachine/CodeGen/Events/SignInEvent.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import AWSCognitoIdentityProvider
1010

1111
typealias Username = String
1212
typealias Password = String
13+
typealias ClientMetadata = [String: String]
1314

1415
struct SignInEvent: StateMachineEvent {
1516

@@ -27,9 +28,9 @@ struct SignInEvent: StateMachineEvent {
2728

2829
case initiateMigrateAuth(SignInEventData, DeviceMetadata)
2930

30-
case respondPasswordVerifier(SRPStateData, InitiateAuthOutputResponse)
31+
case respondPasswordVerifier(SRPStateData, InitiateAuthOutputResponse, ClientMetadata)
3132

32-
case retryRespondPasswordVerifier(SRPStateData, InitiateAuthOutputResponse)
33+
case retryRespondPasswordVerifier(SRPStateData, InitiateAuthOutputResponse, ClientMetadata)
3334

3435
case initiateDeviceSRP(Username, SignInResponseBehavior)
3536

AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/StateMachine/Resolvers/SRP/SRPSignInState+Resolver.swift

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,14 @@ extension SRPSignInState {
3232
switch oldState {
3333
case .notStarted:
3434
return resolveNotStarted(byApplying: srpSignInEvent)
35-
case .initiatingSRPA:
36-
return resolveInitiatingSRPA(byApplying: srpSignInEvent, from: oldState)
35+
case .initiatingSRPA(let signInEventData):
36+
return resolveInitiatingSRPA(
37+
byApplying: srpSignInEvent,
38+
from: oldState)
3739
case .respondingPasswordVerifier(let srpStateData):
38-
return resolveRespondingVerifyPassword(srpStateData: srpStateData, byApplying: srpSignInEvent)
40+
return resolveRespondingVerifyPassword(
41+
srpStateData: srpStateData,
42+
byApplying: srpSignInEvent)
3943
case .signedIn, .error:
4044
return .from(oldState)
4145
case .cancelling:
@@ -83,9 +87,11 @@ extension SRPSignInState {
8387
from oldState: SRPSignInState)
8488
-> StateResolution<SRPSignInState> {
8589
switch signInEvent.eventType {
86-
case .respondPasswordVerifier(let srpStateData, let authResponse):
87-
let action = VerifyPasswordSRP(stateData: srpStateData,
88-
authResponse: authResponse)
90+
case .respondPasswordVerifier(let srpStateData, let authResponse, let clientMetadata):
91+
let action = VerifyPasswordSRP(
92+
stateData: srpStateData,
93+
authResponse: authResponse,
94+
clientMetadata: clientMetadata)
8995
return StateResolution(
9096
newState: SRPSignInState.respondingPasswordVerifier(srpStateData),
9197
actions: [action]
@@ -102,9 +108,11 @@ extension SRPSignInState {
102108
byApplying signInEvent: SignInEvent)
103109
-> StateResolution<SRPSignInState> {
104110
switch signInEvent.eventType {
105-
case .retryRespondPasswordVerifier(let srpStateData, let authResponse):
106-
let action = VerifyPasswordSRP(stateData: srpStateData,
107-
authResponse: authResponse)
111+
case .retryRespondPasswordVerifier(let srpStateData, let authResponse, let clientMetadata):
112+
let action = VerifyPasswordSRP(
113+
stateData: srpStateData,
114+
authResponse: authResponse,
115+
clientMetadata: clientMetadata)
108116
return StateResolution(
109117
newState: SRPSignInState.respondingPasswordVerifier(srpStateData),
110118
actions: [action]

AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Support/Utils/RespondToAuthChallengeInput+Amplify.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ extension RespondToAuthChallengeInput {
1515
session: String?,
1616
secretBlock: String,
1717
signature: String,
18+
clientMetadata: ClientMetadata,
1819
deviceMetadata: DeviceMetadata,
1920
asfDeviceId: String?,
2021
environment: UserPoolEnvironment) -> RespondToAuthChallengeInput {
@@ -29,7 +30,7 @@ extension RespondToAuthChallengeInput {
2930
challengeType: .passwordVerifier,
3031
challengeResponses: challengeResponses,
3132
session: session,
32-
clientMetadata: [:],
33+
clientMetadata: clientMetadata,
3334
asfDeviceId: asfDeviceId,
3435
deviceMetadata: deviceMetadata,
3536
environment: environment)
@@ -119,7 +120,7 @@ extension RespondToAuthChallengeInput {
119120
challengeType: CognitoIdentityProviderClientTypes.ChallengeNameType,
120121
challengeResponses: [String: String],
121122
session: String?,
122-
clientMetadata: [String: String],
123+
clientMetadata: ClientMetadata,
123124
asfDeviceId: String?,
124125
deviceMetadata: DeviceMetadata,
125126
environment: UserPoolEnvironment) -> RespondToAuthChallengeInput {

AmplifyPlugins/Auth/Tests/AWSCognitoAuthPluginUnitTests/ActionTests/InitiateAuthSRP/InitiateAuthSRPTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class InitiateAuthSRPTests: XCTestCase {
9595
return
9696
}
9797

98-
if case let .respondPasswordVerifier(_, authResponse) = event.eventType {
98+
if case let .respondPasswordVerifier(_, authResponse, _) = event.eventType {
9999
XCTAssertNotNil(authResponse)
100100
successEventSent.fulfill()
101101
}

AmplifyPlugins/Auth/Tests/AWSCognitoAuthPluginUnitTests/ActionTests/InitiateAuthSRP/VerifyPasswordSRPTests.swift

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ class VerifyPasswordSRPTests: XCTestCase {
3939

4040
let data = InitiateAuthOutputResponse.validTestData
4141
let action = VerifyPasswordSRP(stateData: SRPStateData.testData,
42-
authResponse: data)
42+
authResponse: data,
43+
clientMetadata: [:])
4344

4445
await action.execute(
4546
withDispatcher: MockDispatcher { _ in },
@@ -71,7 +72,8 @@ class VerifyPasswordSRPTests: XCTestCase {
7172

7273
let data = InitiateAuthOutputResponse.validTestData
7374
let action = VerifyPasswordSRP(stateData: SRPStateData.testData,
74-
authResponse: data)
75+
authResponse: data,
76+
clientMetadata: [:])
7577

7678
let passwordVerifierError = expectation(description: "passwordVerifierError")
7779

@@ -118,7 +120,8 @@ class VerifyPasswordSRPTests: XCTestCase {
118120

119121
let data = InitiateAuthOutputResponse.invalidChallenge
120122
let action = VerifyPasswordSRP(stateData: SRPStateData.testData,
121-
authResponse: data)
123+
authResponse: data,
124+
clientMetadata: [:])
122125

123126
let passwordVerifierError = expectation(
124127
description: "passwordVerifierError")
@@ -165,7 +168,8 @@ class VerifyPasswordSRPTests: XCTestCase {
165168

166169
let data = InitiateAuthOutputResponse.invalidTestDataWithNoSalt
167170
let action = VerifyPasswordSRP(stateData: SRPStateData.testData,
168-
authResponse: data)
171+
authResponse: data,
172+
clientMetadata: [:])
169173

170174
let passwordVerifierError = expectation(
171175
description: "passwordVerifierError")
@@ -212,7 +216,8 @@ class VerifyPasswordSRPTests: XCTestCase {
212216

213217
let data = InitiateAuthOutputResponse.invalidTestDataWithNoSecretBlock
214218
let action = VerifyPasswordSRP(stateData: SRPStateData.testData,
215-
authResponse: data)
219+
authResponse: data,
220+
clientMetadata: [:])
216221

217222
let passwordVerifierError = expectation(
218223
description: "passwordVerifierError")
@@ -259,7 +264,8 @@ class VerifyPasswordSRPTests: XCTestCase {
259264

260265
let data = InitiateAuthOutputResponse.invalidTestDataWithNoSRPB
261266
let action = VerifyPasswordSRP(stateData: SRPStateData.testData,
262-
authResponse: data)
267+
authResponse: data,
268+
clientMetadata: [:])
263269

264270
let passwordVerifierError = expectation(
265271
description: "passwordVerifierError")
@@ -306,7 +312,8 @@ class VerifyPasswordSRPTests: XCTestCase {
306312

307313
let data = InitiateAuthOutputResponse.invalidTestDataForException
308314
let action = VerifyPasswordSRP(stateData: SRPStateData.testData,
309-
authResponse: data)
315+
authResponse: data,
316+
clientMetadata: [:])
310317

311318
let passwordVerifierError = expectation(
312319
description: "passwordVerifierError")
@@ -352,7 +359,8 @@ class VerifyPasswordSRPTests: XCTestCase {
352359

353360
let data = InitiateAuthOutputResponse.validTestData
354361
let action = VerifyPasswordSRP(stateData: SRPStateData.testData,
355-
authResponse: data)
362+
authResponse: data,
363+
clientMetadata: [:])
356364

357365
let passwordVerifierCompletion = expectation(
358366
description: "passwordVerifierCompletion")
@@ -394,7 +402,8 @@ class VerifyPasswordSRPTests: XCTestCase {
394402

395403
let data = InitiateAuthOutputResponse.validTestData
396404
let action = VerifyPasswordSRP(stateData: SRPStateData.testData,
397-
authResponse: data)
405+
authResponse: data,
406+
clientMetadata: [:])
398407

399408
let passwordVerifierError = expectation(
400409
description: "passwordVerifierError")
@@ -443,7 +452,8 @@ class VerifyPasswordSRPTests: XCTestCase {
443452

444453
let data = InitiateAuthOutputResponse.validTestData
445454
let action = VerifyPasswordSRP(stateData: SRPStateData.testData,
446-
authResponse: data)
455+
authResponse: data,
456+
clientMetadata: [:])
447457

448458
let passwordVerifierError = expectation(description: "passwordVerifierError")
449459

@@ -487,7 +497,8 @@ class VerifyPasswordSRPTests: XCTestCase {
487497

488498
let data = InitiateAuthOutputResponse.validTestData
489499
let action = VerifyPasswordSRP(stateData: SRPStateData.testData,
490-
authResponse: data)
500+
authResponse: data,
501+
clientMetadata: [:])
491502

492503
let passwordVerifierCompletion = expectation(
493504
description: "passwordVerifierCompletion")
@@ -529,7 +540,8 @@ class VerifyPasswordSRPTests: XCTestCase {
529540

530541
let data = InitiateAuthOutputResponse.validTestData
531542
let action = VerifyPasswordSRP(stateData: SRPStateData.testData,
532-
authResponse: data)
543+
authResponse: data,
544+
clientMetadata: [:])
533545

534546
let passwordVerifierCompletion = expectation(
535547
description: "passwordVerifierCompletion")

AmplifyPlugins/Auth/Tests/AWSCognitoAuthPluginUnitTests/ResolverTests/SRPSignInState/SRPTestData.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ extension SignInEvent {
134134

135135
static let respondPasswordVerifierEvent = SignInEvent(
136136
id: "respondPasswordVerifierEvent",
137-
eventType: .respondPasswordVerifier(.testData, InitiateAuthOutputResponse.testData)
137+
eventType: .respondPasswordVerifier(.testData, InitiateAuthOutputResponse.testData, [:])
138138
)
139139

140140
static func finalizeSRPSignInEvent(signedInData: SignedInData) -> SignInEvent {

AmplifyPlugins/Auth/Tests/AWSCognitoAuthPluginUnitTests/ResolverTests/SignUpState/RespondToAuthInputTests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class RespondToAuthInputTests: XCTestCase {
8888
session: "session",
8989
secretBlock: "secret",
9090
signature: "signature",
91+
clientMetadata: ["test": "test"],
9192
deviceMetadata: .metadata(.init(deviceKey: "", deviceGroupKey: "")),
9293
asfDeviceId: "asfDeviceId",
9394
environment: environment)

AmplifyPlugins/Auth/Tests/AWSCognitoAuthPluginUnitTests/TaskTests/AWSAuthSignInPluginTests.swift

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,17 @@ class AWSAuthSignInPluginTests: BasePluginTest {
2828
/// - I should get a .done response
2929
///
3030
func testSuccessfulSignIn() async {
31-
32-
self.mockIdentityProvider = MockIdentityProvider(mockInitiateAuthResponse: { _ in
33-
InitiateAuthOutputResponse(
31+
let clientMetadata = ["somekey": "somevalue"]
32+
self.mockIdentityProvider = MockIdentityProvider(mockInitiateAuthResponse: { input in
33+
XCTAssertEqual(clientMetadata, input.clientMetadata)
34+
return InitiateAuthOutputResponse(
3435
authenticationResult: .none,
3536
challengeName: .passwordVerifier,
3637
challengeParameters: InitiateAuthOutputResponse.validChalengeParams,
3738
session: "someSession")
38-
}, mockRespondToAuthChallengeResponse: { _ in
39-
RespondToAuthChallengeOutputResponse(
39+
}, mockRespondToAuthChallengeResponse: { input in
40+
XCTAssertEqual(clientMetadata, input.clientMetadata)
41+
return RespondToAuthChallengeOutputResponse(
4042
authenticationResult: .init(
4143
accessToken: Defaults.validAccessToken,
4244
expiresIn: 300,
@@ -49,7 +51,7 @@ class AWSAuthSignInPluginTests: BasePluginTest {
4951
session: "session")
5052
})
5153

52-
let pluginOptions = AWSAuthSignInOptions(metadata: ["somekey": "somevalue"])
54+
let pluginOptions = AWSAuthSignInOptions(metadata: clientMetadata)
5355
let options = AuthSignInRequest.Options(pluginOptions: pluginOptions)
5456

5557
do {
@@ -310,22 +312,25 @@ class AWSAuthSignInPluginTests: BasePluginTest {
310312
///
311313
func testCustomAuthWithAdditionalInfo() async {
312314

313-
self.mockIdentityProvider = MockIdentityProvider(mockInitiateAuthResponse: { _ in
314-
InitiateAuthOutputResponse(
315+
let clientMetadata = ["somekey": "somevalue"]
316+
self.mockIdentityProvider = MockIdentityProvider(mockInitiateAuthResponse: { input in
317+
XCTAssertEqual(clientMetadata, input.clientMetadata)
318+
return InitiateAuthOutputResponse(
315319
authenticationResult: .none,
316320
challengeName: .passwordVerifier,
317321
challengeParameters: InitiateAuthOutputResponse.validChalengeParams,
318322
session: "someSession")
319-
}, mockRespondToAuthChallengeResponse: { _ in
320-
RespondToAuthChallengeOutputResponse(
323+
}, mockRespondToAuthChallengeResponse: { input in
324+
XCTAssertEqual(clientMetadata, input.clientMetadata)
325+
return RespondToAuthChallengeOutputResponse(
321326
authenticationResult: .none,
322327
challengeName: .customChallenge,
323328
challengeParameters: ["paramKey": "value"],
324329
session: "session")
325330
})
326331

327332
let pluginOptions = AWSAuthSignInOptions(
328-
metadata: ["somekey": "somevalue"],
333+
metadata: clientMetadata,
329334
authFlowType: .customWithSRP
330335
)
331336
let options = AuthSignInRequest.Options(pluginOptions: pluginOptions)

0 commit comments

Comments
 (0)