Skip to content

Commit

Permalink
fix(auth): return configuration error upon invalid redirect URI in ho…
Browse files Browse the repository at this point in the history
…sted ui (#3889)
  • Loading branch information
harsh62 authored Oct 2, 2024
1 parent 95d8f16 commit 619867b
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class ShowHostedUISignIn: NSObject, Action {

guard let callbackURL = URL(string: hostedUIConfig.oauth.signInRedirectURI),
let callbackURLScheme = callbackURL.scheme else {
let event = SignInEvent(eventType: .throwAuthError(.hostedUI(.signInURI)))
let event = HostedUIEvent(eventType: .throwError(.hostedUI(.signInURI)))
logVerbose("\(#fileID) Sending event \(event)", environment: environment)
await dispatcher.send(event)
return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ extension HostedUISignInState {

case .showingUI:
if case .throwError(let error) = event.isHostedUIEvent {
// Remove this?
let action = CancelSignIn()
return .init(newState: .error(error), actions: [action])
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,43 @@ class AWSAuthHostedUISignInTests: XCTestCase {
return URLSession(configuration: configuration)
}

private func customPlugin(with cusotmConfiguration: HostedUIConfigurationData?) -> AWSCognitoAuthPlugin {
let plugin = AWSCognitoAuthPlugin()
mockJson = try! JSONSerialization.data(withJSONObject: mockTokenResult)
MockURLProtocol.requestHandler = { _ in
return (HTTPURLResponse(), self.mockJson)
}

func sessionFactory() -> HostedUISessionBehavior {
MockHostedUISession(result: mockHostedUIResult)
}

func mockRandomString() -> RandomStringBehavior {
return MockRandomStringGenerator(mockString: mockState, mockUUID: mockState)
}

let environment = BasicHostedUIEnvironment(configuration: cusotmConfiguration ?? configuration,
hostedUISessionFactory: sessionFactory,
urlSessionFactory: urlSessionMock,
randomStringFactory: mockRandomString)
let authEnvironment = Defaults.makeDefaultAuthEnvironment(
userPoolFactory: { self.mockIdentityProvider },
hostedUIEnvironment: environment)
let stateMachine = Defaults.authStateMachineWith(
environment: authEnvironment,
initialState: initialState
)

plugin.configure(
authConfiguration: Defaults.makeDefaultAuthConfigData(withHostedUI: configuration),
authEnvironment: authEnvironment,
authStateMachine: stateMachine,
credentialStoreStateMachine: Defaults.makeDefaultCredentialStateMachine(),
hubEventHandler: MockAuthHubEventBehavior(),
analyticsHandler: MockAnalyticsHandler())
return plugin
}

override func setUp() {
plugin = AWSCognitoAuthPlugin()
mockJson = try! JSONSerialization.data(withJSONObject: mockTokenResult)
Expand Down Expand Up @@ -310,6 +347,41 @@ class AWSAuthHostedUISignInTests: XCTestCase {
await fulfillment(of: [expectation], timeout: networkTimeout)
}

@MainActor
func testInvalidRedirectConfigurationFailure() async {
let invalidRedirectConfig = HostedUIConfigurationData(clientId: "clientId", oauth: .init(
domain: "cognitodomain",
scopes: ["name"],
signInRedirectURI: "@#$%junk1343",
signOutRedirectURI: "@3451://"))
let testPlugin = customPlugin(with: invalidRedirectConfig)

mockHostedUIResult = .success([
.init(name: "state", value: mockState),
.init(name: "code", value: mockProof)
])
mockTokenResult = [
"refresh_token": AWSCognitoUserPoolTokens.testData.refreshToken,
"expires_in": 10] as [String: Any]
mockJson = try! JSONSerialization.data(withJSONObject: mockTokenResult)
MockURLProtocol.requestHandler = { _ in
return (HTTPURLResponse(), self.mockJson)
}

let expectation = expectation(description: "SignIn operation should complete")
do {
_ = try await testPlugin.signInWithWebUI(presentationAnchor: ASPresentationAnchor(), options: nil)
XCTFail("Should not succeed")
} catch {
guard case AuthError.configuration = error else {
XCTFail("Should not fail with error = \(error)")
return
}
expectation.fulfill()
}
await fulfillment(of: [expectation], timeout: networkTimeout)
}



/// Test a signIn restart while another sign in is in progress
Expand Down

0 comments on commit 619867b

Please sign in to comment.