@@ -24,6 +24,9 @@ import com.amplifyframework.auth.AuthUser
2424import com.amplifyframework.auth.AuthUserAttribute
2525import com.amplifyframework.auth.AuthUserAttributeKey
2626import 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
2730import com.amplifyframework.auth.options.AuthSignUpOptions
2831import com.amplifyframework.auth.result.AuthResetPasswordResult
2932import com.amplifyframework.auth.result.AuthSignInResult
@@ -44,7 +47,6 @@ import kotlinx.coroutines.channels.awaitClose
4447import kotlinx.coroutines.channels.trySendBlocking
4548import kotlinx.coroutines.flow.Flow
4649import 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
324309internal sealed interface AmplifyResult <out T : Any > {
0 commit comments