Skip to content

Commit 4c0393b

Browse files
authored
feat(authenticator): Upgrade to Gen2 Amplify version (#148)
1 parent da6dd6b commit 4c0393b

File tree

9 files changed

+45
-72
lines changed

9 files changed

+45
-72
lines changed

authenticator/src/main/java/com/amplifyframework/ui/authenticator/AuthenticatorViewModel.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ import com.amplifyframework.ui.authenticator.util.PasswordResetMessage
7676
import com.amplifyframework.ui.authenticator.util.RealAuthProvider
7777
import com.amplifyframework.ui.authenticator.util.UnableToResetPasswordMessage
7878
import com.amplifyframework.ui.authenticator.util.UnknownErrorMessage
79-
import com.amplifyframework.ui.authenticator.util.challengeResponse
8079
import com.amplifyframework.ui.authenticator.util.toFieldError
8180
import java.net.UnknownHostException
8281
import kotlinx.coroutines.channels.BufferOverflow

authenticator/src/main/java/com/amplifyframework/ui/authenticator/states/SignInContinueWithMfaSelectionStateImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.amplifyframework.ui.authenticator.states
22

33
import com.amplifyframework.auth.MFAType
4+
import com.amplifyframework.auth.cognito.challengeResponse
45
import com.amplifyframework.ui.authenticator.SignInContinueWithMfaSelectionState
56
import com.amplifyframework.ui.authenticator.enums.AuthenticatorInitialStep
67
import com.amplifyframework.ui.authenticator.enums.AuthenticatorStep
78
import com.amplifyframework.ui.authenticator.forms.FieldKey
8-
import com.amplifyframework.ui.authenticator.util.challengeResponse
99

1010
internal class SignInContinueWithMfaSelectionStateImpl(
1111
override val allowedMfaTypes: Set<MFAType>,

authenticator/src/main/java/com/amplifyframework/ui/authenticator/ui/SignInContinueWithMfaSelection.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,19 @@ import androidx.compose.foundation.layout.Column
44
import androidx.compose.foundation.layout.fillMaxWidth
55
import androidx.compose.foundation.layout.padding
66
import androidx.compose.runtime.Composable
7-
import androidx.compose.runtime.getValue
87
import androidx.compose.runtime.remember
98
import androidx.compose.runtime.rememberCoroutineScope
10-
import androidx.compose.runtime.setValue
119
import androidx.compose.ui.Modifier
1210
import androidx.compose.ui.platform.LocalContext
1311
import androidx.compose.ui.platform.testTag
1412
import androidx.compose.ui.res.stringResource
1513
import androidx.compose.ui.unit.dp
1614
import com.amplifyframework.auth.MFAType
15+
import com.amplifyframework.auth.cognito.challengeResponse
1716
import com.amplifyframework.ui.authenticator.R
1817
import com.amplifyframework.ui.authenticator.SignInContinueWithMfaSelectionState
1918
import com.amplifyframework.ui.authenticator.enums.AuthenticatorStep
2019
import com.amplifyframework.ui.authenticator.forms.FieldKey
21-
import com.amplifyframework.ui.authenticator.util.challengeResponse
2220
import kotlinx.coroutines.launch
2321

2422
@Composable

authenticator/src/main/java/com/amplifyframework/ui/authenticator/util/AuthProvider.kt

Lines changed: 38 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ import com.amplifyframework.auth.AuthUser
2424
import com.amplifyframework.auth.AuthUserAttribute
2525
import com.amplifyframework.auth.AuthUserAttributeKey
2626
import com.amplifyframework.auth.cognito.AWSCognitoAuthPlugin
27+
import com.amplifyframework.auth.cognito.PasswordProtectionSettings
28+
import com.amplifyframework.auth.cognito.UsernameAttribute
29+
import com.amplifyframework.auth.cognito.VerificationMechanism as AmplifyVerificationMechanism
2730
import com.amplifyframework.auth.options.AuthSignUpOptions
2831
import com.amplifyframework.auth.result.AuthResetPasswordResult
2932
import com.amplifyframework.auth.result.AuthSignInResult
@@ -44,7 +47,6 @@ import kotlinx.coroutines.channels.awaitClose
4447
import kotlinx.coroutines.channels.trySendBlocking
4548
import kotlinx.coroutines.flow.Flow
4649
import kotlinx.coroutines.flow.callbackFlow
47-
import org.json.JSONException
4850

4951
/**
5052
* An abstraction of the Amplify.Auth API that allows us to use coroutines with no exceptions
@@ -253,62 +255,31 @@ internal class RealAuthProvider : AuthProvider {
253255
}
254256

255257
override suspend fun getConfiguration(): AuthConfigurationResult {
256-
val authConfigJSON = getCognitoPlugin()?.getPluginConfiguration() ?: return AuthConfigurationResult.Missing
257-
try {
258-
val innerJSON = authConfigJSON
259-
.getJSONObject("Auth")
260-
.getJSONObject("Default")
261-
val signUpAttributes = innerJSON.getJSONArray("signupAttributes")
262-
val usernameAttributes = innerJSON.getJSONArray("usernameAttributes")
263-
val passwordAttributes = innerJSON.getJSONObject("passwordProtectionSettings")
264-
265-
val signInAttributeList = List(usernameAttributes.length()) {
266-
usernameAttributes.getString(it)
267-
}
268-
val containsEmail = signInAttributeList.contains("EMAIL")
269-
val containsPhoneNumber = signInAttributeList.contains("PHONE_NUMBER")
270-
val signInMethod = when {
271-
containsEmail -> SignInMethod.Email
272-
containsPhoneNumber -> SignInMethod.PhoneNumber
273-
else -> SignInMethod.Username
274-
}
258+
val authConfiguration = getCognitoPlugin()?.getAuthConfiguration() ?: return AuthConfigurationResult.Missing
259+
260+
val passwordCriteria = authConfiguration.passwordProtectionSettings?.toPasswordCriteria()
261+
?: return AuthConfigurationResult.Invalid(
262+
"""
263+
Your auth configuration does not define passwordProtectionSettings.
264+
Authenticator needs these settings to perform client-side validation of passwords.
265+
""".trimIndent()
266+
)
275267

276-
val signUpAttributeList = List(signUpAttributes.length()) {
277-
AuthUserAttributeKey.custom(signUpAttributes.getString(it).lowercase())
268+
val verificationMechanisms = authConfiguration.verificationMechanisms.map {
269+
when (it) {
270+
AmplifyVerificationMechanism.Email -> VerificationMechanism.Email
271+
AmplifyVerificationMechanism.PhoneNumber -> VerificationMechanism.PhoneNumber
278272
}
273+
}.toSet()
279274

280-
val passwordRequirementsJSON = passwordAttributes
281-
.getJSONArray("passwordPolicyCharacters")
282-
val passwordRequirements = List(passwordRequirementsJSON.length()) {
283-
passwordRequirementsJSON.getString(it)
284-
}
285-
val passwordCriteria = PasswordCriteria(
286-
length = passwordAttributes.getInt("passwordPolicyMinLength"),
287-
requiresNumber = passwordRequirements.contains("REQUIRES_NUMBERS"),
288-
requiresSpecial = passwordRequirements.contains("REQUIRES_SYMBOLS"),
289-
requiresLower = passwordRequirements.contains("REQUIRES_LOWER"),
290-
requiresUpper = passwordRequirements.contains("REQUIRES_UPPER")
291-
)
275+
val amplifyAuthConfiguration = AmplifyAuthConfiguration(
276+
signInMethod = getSignInMethod(authConfiguration.usernameAttributes),
277+
signUpAttributes = authConfiguration.signUpAttributes,
278+
passwordCriteria = passwordCriteria,
279+
verificationMechanisms = verificationMechanisms
280+
)
292281

293-
val verificationMechanismsJson = innerJSON.getJSONArray("verificationMechanisms")
294-
val verificationMechanisms = List(verificationMechanismsJson.length()) {
295-
when (verificationMechanismsJson.getString(it)) {
296-
"EMAIL" -> VerificationMechanism.Email
297-
else -> VerificationMechanism.PhoneNumber
298-
}
299-
}.toSet()
300-
301-
return AuthConfigurationResult.Valid(
302-
AmplifyAuthConfiguration(
303-
signInMethod,
304-
signUpAttributeList,
305-
passwordCriteria,
306-
verificationMechanisms
307-
)
308-
)
309-
} catch (e: JSONException) {
310-
return AuthConfigurationResult.Invalid(e.message ?: "Auth configuration is not valid", e)
311-
}
282+
return AuthConfigurationResult.Valid(amplifyAuthConfiguration)
312283
}
313284

314285
private fun getCognitoPlugin(): AWSCognitoAuthPlugin? {
@@ -319,6 +290,20 @@ internal class RealAuthProvider : AuthProvider {
319290
null
320291
}
321292
}
293+
294+
private fun getSignInMethod(attributes: List<UsernameAttribute>) = when {
295+
attributes.contains(UsernameAttribute.Email) -> SignInMethod.Email
296+
attributes.contains(UsernameAttribute.PhoneNumber) -> SignInMethod.PhoneNumber
297+
else -> SignInMethod.Username
298+
}
299+
300+
private fun PasswordProtectionSettings.toPasswordCriteria() = PasswordCriteria(
301+
length = length,
302+
requiresNumber = requiresNumber,
303+
requiresSpecial = requiresSpecial,
304+
requiresUpper = requiresUpper,
305+
requiresLower = requiresLower
306+
)
322307
}
323308

324309
internal sealed interface AmplifyResult<out T : Any> {

authenticator/src/main/java/com/amplifyframework/ui/authenticator/util/MfaTypeExtensions.kt

Lines changed: 0 additions & 11 deletions
This file was deleted.

authenticator/src/test/java/com/amplifyframework/ui/authenticator/ui/SignInContinueWithMfaSelectionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.amplifyframework.ui.authenticator.ui
22

33
import com.amplifyframework.auth.MFAType
4+
import com.amplifyframework.auth.cognito.challengeResponse
45
import com.amplifyframework.ui.authenticator.enums.AuthenticatorInitialStep
56
import com.amplifyframework.ui.authenticator.enums.AuthenticatorStep
67
import com.amplifyframework.ui.authenticator.states.SignInContinueWithMfaSelectionStateImpl
78
import com.amplifyframework.ui.authenticator.ui.robots.signInContinueWithMfaSelection
8-
import com.amplifyframework.ui.authenticator.util.challengeResponse
99
import com.amplifyframework.ui.testing.ComposeTest
1010
import io.mockk.mockk
1111
import io.mockk.verify

authenticator/src/test/java/com/amplifyframework/ui/authenticator/ui/robots/SignInContinueWithMfaSelectionRobot.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import androidx.compose.ui.test.hasTestTag
2020
import androidx.compose.ui.test.isSelected
2121
import androidx.compose.ui.test.junit4.ComposeTestRule
2222
import com.amplifyframework.auth.MFAType
23+
import com.amplifyframework.auth.cognito.challengeResponse
2324
import com.amplifyframework.ui.authenticator.ui.TestTags
24-
import com.amplifyframework.ui.authenticator.util.challengeResponse
2525
import com.amplifyframework.ui.testing.ComposeTest
2626

2727
fun ComposeTest.signInContinueWithMfaSelection(func: SignInContinueWithMfaSelectionRobot.() -> Unit) =

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[versions]
22
agp = "8.1.4"
3-
amplify = "2.15.0"
3+
amplify = "2.16.0"
44
binary-compatibility = "0.14.0"
55
cameraX = "1.2.0"
66
compose = "1.5.4"

samples/authenticator/app/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ android {
2424
}
2525
}
2626
compileOptions {
27+
coreLibraryDesugaringEnabled true
2728
sourceCompatibility JavaVersion.VERSION_1_8
2829
targetCompatibility JavaVersion.VERSION_1_8
2930
}
@@ -53,6 +54,7 @@ dependencies {
5354
// Use this to use published version of Amplify UI
5455
implementation "com.amplifyframework.ui:authenticator:$authenticatorVersion"
5556

57+
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
5658
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
5759
implementation "com.google.accompanist:accompanist-permissions:0.28.0"
5860
implementation 'androidx.core:core-ktx:1.9.0'

0 commit comments

Comments
 (0)