Skip to content

Commit c9b0f0f

Browse files
authored
chore(auth): Move hosted UI sign in to use case (#3242)
1 parent d09047f commit c9b0f0f

8 files changed

Lines changed: 463 additions & 251 deletions

File tree

aws-auth-cognito/src/main/java/com/amplifyframework/auth/cognito/AWSCognitoAuthPlugin.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -260,28 +260,36 @@ class AWSCognitoAuthPlugin : AuthPlugin<AWSCognitoAuthService>() {
260260
callingActivity: Activity,
261261
onSuccess: Consumer<AuthSignInResult>,
262262
onError: Consumer<AuthException>
263-
) = enqueue(onSuccess, onError) { queueFacade.signInWithSocialWebUI(provider, callingActivity) }
263+
) = enqueue(onSuccess, onError) {
264+
useCaseFactory.webUiSignIn().execute(callingActivity, provider)
265+
}
264266

265267
override fun signInWithSocialWebUI(
266268
provider: AuthProvider,
267269
callingActivity: Activity,
268270
options: AuthWebUISignInOptions,
269271
onSuccess: Consumer<AuthSignInResult>,
270272
onError: Consumer<AuthException>
271-
) = enqueue(onSuccess, onError) { queueFacade.signInWithSocialWebUI(provider, callingActivity, options) }
273+
) = enqueue(onSuccess, onError) {
274+
useCaseFactory.webUiSignIn().execute(callingActivity, provider, options)
275+
}
272276

273277
override fun signInWithWebUI(
274278
callingActivity: Activity,
275279
onSuccess: Consumer<AuthSignInResult>,
276280
onError: Consumer<AuthException>
277-
) = enqueue(onSuccess, onError) { queueFacade.signInWithWebUI(callingActivity) }
281+
) = enqueue(onSuccess, onError) {
282+
useCaseFactory.webUiSignIn().execute(callingActivity = callingActivity)
283+
}
278284

279285
override fun signInWithWebUI(
280286
callingActivity: Activity,
281287
options: AuthWebUISignInOptions,
282288
onSuccess: Consumer<AuthSignInResult>,
283289
onError: Consumer<AuthException>
284-
) = enqueue(onSuccess, onError) { queueFacade.signInWithWebUI(callingActivity, options) }
290+
) = enqueue(onSuccess, onError) {
291+
useCaseFactory.webUiSignIn().execute(callingActivity = callingActivity, options = options)
292+
}
285293

286294
override fun handleWebUISignInResponse(intent: Intent?) {
287295
pluginScope.launch {

aws-auth-cognito/src/main/java/com/amplifyframework/auth/cognito/KotlinAuthFacadeInternal.kt

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -15,60 +15,14 @@
1515

1616
package com.amplifyframework.auth.cognito
1717

18-
import android.app.Activity
19-
import com.amplifyframework.auth.AuthProvider
2018
import com.amplifyframework.auth.AuthSession
2119
import com.amplifyframework.auth.options.AuthFetchSessionOptions
22-
import com.amplifyframework.auth.options.AuthWebUISignInOptions
23-
import com.amplifyframework.auth.result.AuthSignInResult
2420
import kotlin.coroutines.resume
2521
import kotlin.coroutines.resumeWithException
2622
import kotlin.coroutines.suspendCoroutine
2723

2824
internal class KotlinAuthFacadeInternal(private val delegate: RealAWSCognitoAuthPlugin) {
2925

30-
suspend fun signInWithSocialWebUI(provider: AuthProvider, callingActivity: Activity): AuthSignInResult =
31-
suspendCoroutine { continuation ->
32-
delegate.signInWithSocialWebUI(
33-
provider,
34-
callingActivity,
35-
{ continuation.resume(it) },
36-
{ continuation.resumeWithException(it) }
37-
)
38-
}
39-
40-
suspend fun signInWithSocialWebUI(
41-
provider: AuthProvider,
42-
callingActivity: Activity,
43-
options: AuthWebUISignInOptions
44-
): AuthSignInResult = suspendCoroutine { continuation ->
45-
delegate.signInWithSocialWebUI(
46-
provider,
47-
callingActivity,
48-
options,
49-
{ continuation.resume(it) },
50-
{ continuation.resumeWithException(it) }
51-
)
52-
}
53-
54-
suspend fun signInWithWebUI(callingActivity: Activity): AuthSignInResult = suspendCoroutine { continuation ->
55-
delegate.signInWithWebUI(
56-
callingActivity,
57-
{ continuation.resume(it) },
58-
{ continuation.resumeWithException(it) }
59-
)
60-
}
61-
62-
suspend fun signInWithWebUI(callingActivity: Activity, options: AuthWebUISignInOptions): AuthSignInResult =
63-
suspendCoroutine { continuation ->
64-
delegate.signInWithWebUI(
65-
callingActivity,
66-
options,
67-
{ continuation.resume(it) },
68-
{ continuation.resumeWithException(it) }
69-
)
70-
}
71-
7226
suspend fun fetchAuthSession(): AuthSession = suspendCoroutine { continuation ->
7327
delegate.fetchAuthSession(
7428
{ continuation.resume(it) },

aws-auth-cognito/src/main/java/com/amplifyframework/auth/cognito/RealAWSCognitoAuthPlugin.kt

Lines changed: 0 additions & 181 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,14 @@
1515

1616
package com.amplifyframework.auth.cognito
1717

18-
import android.app.Activity
1918
import androidx.annotation.WorkerThread
2019
import com.amplifyframework.AmplifyException
2120
import com.amplifyframework.annotations.InternalAmplifyApi
2221
import com.amplifyframework.auth.AWSCognitoAuthMetadataType
2322
import com.amplifyframework.auth.AuthChannelEventName
2423
import com.amplifyframework.auth.AuthException
25-
import com.amplifyframework.auth.AuthProvider
2624
import com.amplifyframework.auth.AuthSession
27-
import com.amplifyframework.auth.cognito.exceptions.configuration.InvalidOauthConfigurationException
28-
import com.amplifyframework.auth.cognito.exceptions.configuration.InvalidUserPoolConfigurationException
29-
import com.amplifyframework.auth.cognito.exceptions.invalidstate.SignedInException
3025
import com.amplifyframework.auth.cognito.exceptions.service.InvalidAccountTypeException
31-
import com.amplifyframework.auth.cognito.helpers.HostedUIHelper
32-
import com.amplifyframework.auth.cognito.options.AWSCognitoAuthWebUISignInOptions
3326
import com.amplifyframework.auth.exceptions.ConfigurationException
3427
import com.amplifyframework.auth.exceptions.InvalidStateException
3528
import com.amplifyframework.auth.exceptions.NotAuthorizedException
@@ -38,26 +31,18 @@ import com.amplifyframework.auth.exceptions.SessionExpiredException
3831
import com.amplifyframework.auth.exceptions.SignedOutException
3932
import com.amplifyframework.auth.exceptions.UnknownException
4033
import com.amplifyframework.auth.options.AuthFetchSessionOptions
41-
import com.amplifyframework.auth.options.AuthWebUISignInOptions
42-
import com.amplifyframework.auth.result.AuthSignInResult
43-
import com.amplifyframework.auth.result.step.AuthNextSignInStep
44-
import com.amplifyframework.auth.result.step.AuthSignInStep
4534
import com.amplifyframework.core.Amplify
4635
import com.amplifyframework.core.Consumer
4736
import com.amplifyframework.hub.HubChannel
4837
import com.amplifyframework.hub.HubEvent
4938
import com.amplifyframework.logging.Logger
5039
import com.amplifyframework.statemachine.StateChangeListenerToken
5140
import com.amplifyframework.statemachine.codegen.data.AmplifyCredential
52-
import com.amplifyframework.statemachine.codegen.data.SignInData
5341
import com.amplifyframework.statemachine.codegen.errors.SessionError
5442
import com.amplifyframework.statemachine.codegen.events.AuthEvent
55-
import com.amplifyframework.statemachine.codegen.events.AuthenticationEvent
5643
import com.amplifyframework.statemachine.codegen.events.AuthorizationEvent
5744
import com.amplifyframework.statemachine.codegen.states.AuthState
58-
import com.amplifyframework.statemachine.codegen.states.AuthenticationState
5945
import com.amplifyframework.statemachine.codegen.states.AuthorizationState
60-
import com.amplifyframework.statemachine.codegen.states.HostedUISignInState
6146
import java.util.concurrent.CountDownLatch
6247
import java.util.concurrent.TimeUnit
6348
import kotlinx.coroutines.flow.collect
@@ -111,172 +96,6 @@ internal class RealAWSCognitoAuthPlugin(
11196
authStateMachine.state.takeWhile { it !is AuthState.Configured && it !is AuthState.Error }.collect()
11297
}
11398

114-
fun signInWithSocialWebUI(
115-
provider: AuthProvider,
116-
callingActivity: Activity,
117-
onSuccess: Consumer<AuthSignInResult>,
118-
onError: Consumer<AuthException>
119-
) {
120-
signInWithSocialWebUI(
121-
provider,
122-
callingActivity,
123-
AWSCognitoAuthWebUISignInOptions.builder().build(),
124-
onSuccess,
125-
onError
126-
)
127-
}
128-
129-
fun signInWithSocialWebUI(
130-
provider: AuthProvider,
131-
callingActivity: Activity,
132-
options: AuthWebUISignInOptions,
133-
onSuccess: Consumer<AuthSignInResult>,
134-
onError: Consumer<AuthException>
135-
) {
136-
signInWithHostedUI(
137-
provider = provider,
138-
callingActivity = callingActivity,
139-
options = options,
140-
onSuccess = onSuccess,
141-
onError = onError
142-
)
143-
}
144-
145-
fun signInWithWebUI(
146-
callingActivity: Activity,
147-
onSuccess: Consumer<AuthSignInResult>,
148-
onError: Consumer<AuthException>
149-
) {
150-
signInWithWebUI(callingActivity, AuthWebUISignInOptions.builder().build(), onSuccess, onError)
151-
}
152-
153-
fun signInWithWebUI(
154-
callingActivity: Activity,
155-
options: AuthWebUISignInOptions,
156-
onSuccess: Consumer<AuthSignInResult>,
157-
onError: Consumer<AuthException>
158-
) {
159-
signInWithHostedUI(
160-
callingActivity = callingActivity,
161-
options = options,
162-
onSuccess = onSuccess,
163-
onError = onError
164-
)
165-
}
166-
167-
private fun signInWithHostedUI(
168-
provider: AuthProvider? = null,
169-
callingActivity: Activity,
170-
options: AuthWebUISignInOptions,
171-
onSuccess: Consumer<AuthSignInResult>,
172-
onError: Consumer<AuthException>
173-
) {
174-
authStateMachine.getCurrentState { authState ->
175-
when (authState.authNState) {
176-
is AuthenticationState.NotConfigured -> onError.accept(
177-
InvalidUserPoolConfigurationException()
178-
)
179-
// Continue sign in
180-
is AuthenticationState.SignedOut -> {
181-
if (configuration.oauth == null) {
182-
onError.accept(InvalidOauthConfigurationException())
183-
return@getCurrentState
184-
}
185-
186-
_signInWithHostedUI(
187-
callingActivity = callingActivity,
188-
options = options,
189-
onSuccess = onSuccess,
190-
onError = onError,
191-
provider = provider
192-
)
193-
}
194-
is AuthenticationState.SignedIn -> onError.accept(SignedInException())
195-
is AuthenticationState.SigningIn -> {
196-
val token = StateChangeListenerToken()
197-
authStateMachine.listen(
198-
token,
199-
{ authState ->
200-
when (authState.authNState) {
201-
is AuthenticationState.SignedOut -> {
202-
authStateMachine.cancel(token)
203-
_signInWithHostedUI(
204-
callingActivity = callingActivity,
205-
options = options,
206-
onSuccess = onSuccess,
207-
onError = onError,
208-
provider = provider
209-
)
210-
}
211-
else -> Unit
212-
}
213-
},
214-
{
215-
authStateMachine.send(AuthenticationEvent(AuthenticationEvent.EventType.CancelSignIn()))
216-
}
217-
)
218-
}
219-
else -> onError.accept(InvalidStateException())
220-
}
221-
}
222-
}
223-
224-
private fun _signInWithHostedUI(
225-
callingActivity: Activity,
226-
options: AuthWebUISignInOptions,
227-
onSuccess: Consumer<AuthSignInResult>,
228-
onError: Consumer<AuthException>,
229-
provider: AuthProvider? = null
230-
) {
231-
val token = StateChangeListenerToken()
232-
authStateMachine.listen(
233-
token,
234-
{ authState ->
235-
val authNState = authState.authNState
236-
val authZState = authState.authZState
237-
when {
238-
authNState is AuthenticationState.SigningIn -> {
239-
val hostedUISignInState = authNState.signInState.hostedUISignInState
240-
if (hostedUISignInState is HostedUISignInState.Error) {
241-
authStateMachine.cancel(token)
242-
val exception = hostedUISignInState.exception
243-
onError.accept(
244-
if (exception is AuthException) {
245-
exception
246-
} else {
247-
UnknownException("Sign in failed", exception)
248-
}
249-
)
250-
authStateMachine.send(AuthenticationEvent(AuthenticationEvent.EventType.CancelSignIn()))
251-
}
252-
}
253-
authNState is AuthenticationState.SignedIn &&
254-
authZState is AuthorizationState.SessionEstablished -> {
255-
authStateMachine.cancel(token)
256-
val authSignInResult =
257-
AuthSignInResult(
258-
true,
259-
AuthNextSignInStep(AuthSignInStep.DONE, mapOf(), null, null, null, null)
260-
)
261-
onSuccess.accept(authSignInResult)
262-
sendHubEvent(AuthChannelEventName.SIGNED_IN.toString())
263-
}
264-
else -> Unit
265-
}
266-
},
267-
{
268-
val hostedUIOptions = HostedUIHelper.createHostedUIOptions(callingActivity, provider, options)
269-
authStateMachine.send(
270-
AuthenticationEvent(
271-
AuthenticationEvent.EventType.SignInRequested(
272-
SignInData.HostedUISignInData(hostedUIOptions)
273-
)
274-
)
275-
)
276-
}
277-
)
278-
}
279-
28099
fun fetchAuthSession(onSuccess: Consumer<AuthSession>, onError: Consumer<AuthException>) {
281100
fetchAuthSession(AuthFetchSessionOptions.defaults(), onSuccess, onError)
282101
}

aws-auth-cognito/src/main/java/com/amplifyframework/auth/cognito/usecases/AuthUseCaseFactory.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,11 @@ internal class AuthUseCaseFactory(
179179
signOut = signOut()
180180
)
181181

182+
fun webUiSignIn() = WebUiSignInUseCase(
183+
stateMachine = stateMachine,
184+
configuration = authEnvironment.configuration
185+
)
186+
182187
fun webUISignInResponse() = WebUiSignInResponseUseCase(
183188
stateMachine = stateMachine,
184189
authEnvironment = authEnvironment

0 commit comments

Comments
 (0)