Skip to content

Commit e25c0b4

Browse files
authored
chore(auth): update getCurrentUser to check for SessionExpiredException (#2882)
1 parent 5b522f6 commit e25c0b4

File tree

2 files changed

+110
-6
lines changed

2 files changed

+110
-6
lines changed

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1820,12 +1820,18 @@ internal class RealAWSCognitoAuthPlugin(
18201820
when (authState.authNState) {
18211821
is AuthenticationState.SignedIn -> {
18221822
GlobalScope.async {
1823-
val accessToken = getSession().userPoolTokensResult.value?.accessToken
1824-
accessToken?.run {
1825-
val userid = SessionHelper.getUserSub(accessToken) ?: ""
1826-
val username = SessionHelper.getUsername(accessToken) ?: ""
1827-
onSuccess.accept(AuthUser(userid, username))
1828-
} ?: onError.accept(InvalidUserPoolConfigurationException())
1823+
val userPoolToken = getSession().userPoolTokensResult
1824+
val userPoolTokenResultError = userPoolToken.error
1825+
if (userPoolTokenResultError != null && userPoolTokenResultError is SessionExpiredException) {
1826+
onError.accept(userPoolTokenResultError)
1827+
} else {
1828+
val accessToken = userPoolToken.value?.accessToken
1829+
accessToken?.run {
1830+
val userid = SessionHelper.getUserSub(accessToken) ?: ""
1831+
val username = SessionHelper.getUsername(accessToken) ?: ""
1832+
onSuccess.accept(AuthUser(userid, username))
1833+
} ?: onError.accept(InvalidUserPoolConfigurationException())
1834+
}
18291835
}
18301836
}
18311837
is AuthenticationState.SignedOut -> {

aws-auth-cognito/src/test/java/com/amplifyframework/auth/cognito/RealAWSCognitoAuthPluginTest.kt

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,15 @@ import com.amplifyframework.auth.AuthCodeDeliveryDetails
5252
import com.amplifyframework.auth.AuthDevice
5353
import com.amplifyframework.auth.AuthException
5454
import com.amplifyframework.auth.AuthSession
55+
import com.amplifyframework.auth.AuthUser
5556
import com.amplifyframework.auth.AuthUserAttribute
5657
import com.amplifyframework.auth.AuthUserAttributeKey
5758
import com.amplifyframework.auth.MFAType
5859
import com.amplifyframework.auth.TOTPSetupDetails
5960
import com.amplifyframework.auth.cognito.exceptions.configuration.InvalidUserPoolConfigurationException
6061
import com.amplifyframework.auth.cognito.helpers.AuthHelper
6162
import com.amplifyframework.auth.cognito.helpers.SRPHelper
63+
import com.amplifyframework.auth.cognito.helpers.SessionHelper
6264
import com.amplifyframework.auth.cognito.options.AWSCognitoAuthResendUserAttributeConfirmationCodeOptions
6365
import com.amplifyframework.auth.cognito.options.AWSCognitoAuthSignInOptions
6466
import com.amplifyframework.auth.cognito.options.AWSCognitoAuthUpdateUserAttributeOptions
@@ -67,6 +69,7 @@ import com.amplifyframework.auth.cognito.options.AWSCognitoAuthVerifyTOTPSetupOp
6769
import com.amplifyframework.auth.cognito.options.AuthFlowType
6870
import com.amplifyframework.auth.cognito.usecases.ResetPasswordUseCase
6971
import com.amplifyframework.auth.exceptions.InvalidStateException
72+
import com.amplifyframework.auth.exceptions.SessionExpiredException
7073
import com.amplifyframework.auth.exceptions.SignedOutException
7174
import com.amplifyframework.auth.options.AuthConfirmResetPasswordOptions
7275
import com.amplifyframework.auth.options.AuthConfirmSignUpOptions
@@ -91,6 +94,7 @@ import com.amplifyframework.statemachine.codegen.data.DeviceMetadata
9194
import com.amplifyframework.statemachine.codegen.data.SignInMethod
9295
import com.amplifyframework.statemachine.codegen.data.SignedInData
9396
import com.amplifyframework.statemachine.codegen.data.UserPoolConfiguration
97+
import com.amplifyframework.statemachine.codegen.errors.SessionError
9498
import com.amplifyframework.statemachine.codegen.states.AuthState
9599
import com.amplifyframework.statemachine.codegen.states.AuthenticationState
96100
import com.amplifyframework.statemachine.codegen.states.AuthorizationState
@@ -242,6 +246,100 @@ class RealAWSCognitoAuthPluginTest {
242246
verify(exactly = 0) { onSuccess.accept(any()) }
243247
}
244248

249+
@Test
250+
fun testGetCurrentUserSucceedsIfSignedIn() {
251+
// GIVEN
252+
val onSuccess = mockk<Consumer<AuthUser>>()
253+
val onError = mockk<Consumer<AuthException>>()
254+
mockkObject(SessionHelper)
255+
every { SessionHelper.getUsername(any()) } returns "username"
256+
every { SessionHelper.getUserSub(any()) } returns "sub"
257+
// WHEN
258+
plugin.getCurrentUser(onSuccess, onError)
259+
260+
// THEN
261+
verify { onSuccess.accept(any()) }
262+
verify(exactly = 0) { onError.accept(any()) }
263+
}
264+
265+
@Test
266+
fun testGetCurrentUserFailsWithInvalidStateException() {
267+
// GIVEN
268+
val onSuccess = mockk<Consumer<AuthUser>>()
269+
val onError = mockk<Consumer<AuthException>>(relaxed = true)
270+
271+
setupCurrentAuthState(authNState = AuthenticationState.NotConfigured())
272+
273+
// WHEN
274+
plugin.getCurrentUser(onSuccess, onError)
275+
276+
// THEN
277+
verify(exactly = 0) { onSuccess.accept(any()) }
278+
verify { onError.accept(InvalidStateException()) }
279+
}
280+
281+
@Test
282+
fun testGetCurrentUserFailsWithSignedOutException() {
283+
// GIVEN
284+
val onSuccess = mockk<Consumer<AuthUser>>()
285+
val onError = mockk<Consumer<AuthException>>(relaxed = true)
286+
287+
setupCurrentAuthState(
288+
authNState = AuthenticationState.SignedOut(mockk()),
289+
authZState = AuthorizationState.Configured()
290+
)
291+
// WHEN
292+
plugin.getCurrentUser(onSuccess, onError)
293+
294+
// THEN
295+
verify(exactly = 0) { onSuccess.accept(any()) }
296+
verify { onError.accept(SignedOutException()) }
297+
}
298+
299+
@Test
300+
fun testGetCurrentUserFailsWithExpiredSessionException() {
301+
// GIVEN
302+
val onGetCurrentUserSuccess = mockk<Consumer<AuthUser>>()
303+
val onGetCurrentUserError = mockk<Consumer<AuthException>>(relaxed = true)
304+
val sessionExpiredException = SessionExpiredException()
305+
val sessionError = SessionError(sessionExpiredException, credentials)
306+
val authNState = AuthenticationState.SignedIn(
307+
mockk {
308+
every { username } returns "username"
309+
},
310+
mockk()
311+
)
312+
val authZState = AuthorizationState.Error(sessionError)
313+
314+
setupCurrentAuthState(
315+
authNState = authNState,
316+
authZState = authZState
317+
)
318+
319+
val sessionErrorState = mockk<AuthState> {
320+
every { this@mockk.authNState } returns AuthenticationState.SignedIn(
321+
mockk {
322+
every { username } returns "username"
323+
},
324+
mockk()
325+
)
326+
every { this@mockk.authZState } returns AuthorizationState.Error(sessionError)
327+
}
328+
329+
every {
330+
authStateMachine.listen(any(), captureLambda(), null)
331+
} answers {
332+
lambda<(AuthState) -> Unit>().invoke(sessionErrorState)
333+
}
334+
335+
// WHEN
336+
plugin.getCurrentUser(onGetCurrentUserSuccess, onGetCurrentUserError)
337+
338+
// THEN
339+
verify(exactly = 0) { onGetCurrentUserSuccess.accept(any()) }
340+
verify(timeout = 1000L) { onGetCurrentUserError.accept(sessionExpiredException) }
341+
}
342+
245343
@Test
246344
fun testCustomSignInWithSRPSucceedsWithChallenge() {
247345
// GIVEN

0 commit comments

Comments
 (0)