we are trying to configure the AWS Amplify Authentication (Cognito) on Android, but when we try to sign in the user with a valid username and password, the onResult callback is called with a signInState equals to SignInState.DONE, but when we tries to get the token (both sync or async), a Exception raises: "getTokens does not support retrieving tokens while signed-out".
Looking in the log, seems like a unhandled exception raises and appears to be ignored (because of the sign in state DONE):
java.lang.RuntimeException: Error in federating the token. at com.amazonaws.mobile.client.AWSMobileClient$8.run(AWSMobileClient.java:1484) at com.amazonaws.mobile.client.internal.InternalCallback.await(InternalCallback.java:115) at com.amazonaws.mobile.client.AWSMobileClient.federatedSignInWithoutAssigningState(AWSMobileClient.java:1414) at com.amazonaws.mobile.client.AWSMobileClient$6$1.onSuccess(AWSMobileClient.java:1156) at com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUser.getSession(CognitoUser.java:745) at com.amazonaws.mobile.client.AWSMobileClient$6.run(AWSMobileClient.java:1142) at com.amazonaws.mobile.client.internal.InternalCallback$1.run(InternalCallback.java:101) at java.lang.Thread.run(Thread.java:818) Caused by: com.amazonaws.services.cognitoidentity.model.NotAuthorizedException: Token is not from a supported provider of this identity pool. (Service: AmazonCognitoIdentity; Status Code: 400; Error Code: NotAuthorizedException; Request ID: 3c924e1f-70ea-11e9-80ca-01ad7f96c8b7) at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:730) at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:405) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:212) at com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient.invoke(AmazonCognitoIdentityClient.java:1658) at com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient.getId(AmazonCognitoIdentityClient.java:739) at com.amazonaws.auth.AWSAbstractCognitoIdentityProvider.getIdentityId(AWSAbstractCognitoIdentityProvider.java:172) at com.amazonaws.mobile.client.AWSMobileClientCognitoIdentityProvider.refresh(AWSMobileClient.java:3600) at com.amazonaws.auth.CognitoCredentialsProvider.startSession(CognitoCredentialsProvider.java:678) at com.amazonaws.auth.CognitoCredentialsProvider.refresh(CognitoCredentialsProvider.java:631) at com.amazonaws.auth.CognitoCachingCredentialsProvider.refresh(CognitoCachingCredentialsProvider.java:510) at com.amazonaws.mobile.client.AWSMobileClient.federateWithCognitoIdentity(AWSMobileClient.java:1515) at com.amazonaws.mobile.client.AWSMobileClient$8.run(AWSMobileClient.java:1471)
My configuration:
build.gradle (app)
implementation "com.amazonaws:aws-android-sdk-mobile-client:2.13.4"
implementation "com.amazonaws:aws-android-sdk-auth-userpools:2.13.4"
MainApplication.kt (extends Application)
AWSMobileClient.getInstance().initialize(applicationContext, object : Callback<UserStateDetails> {
override fun onError(e: Exception?) {
Timber.e(e, "An error occurred while tried to init the AWSMobileClient")
}
override fun onResult(result: UserStateDetails?) {
Timber.d("Successfully started the AWSMobileClient: ${result?.userState}") // Reaches here with SIGNED_OUT
}
})
Repository.kt
suspend fun signInOnCognito(email: String, password: String): String =
suspendCoroutine { continuation ->
val signInCallback = object : Callback<SignInResult> {
override fun onResult(result: SignInResult) {
Timber.d("Sign in result: ${result.signInState}") // <---- DONE
fetchToken(continuation)
}
override fun onError(exception: java.lang.Exception) {
continuation.resumeWithException(exception)
}
}
AWSMobileClient.getInstance().signIn(email, password, null, signInCallback)
}
fun fetchToken(continuation: Continuation<String>) {
val getTokensCallback = object : Callback<Tokens> {
override fun onResult(result: Tokens) {
Timber.d("Got the user token")
continuation.resume(result.idToken.tokenString)
}
override fun onError(e: Exception) {
Timber.e(e, "Cannot get the user token")
continuation.resumeWithException(e)
}
}
AWSMobileClient.getInstance().getTokens(getTokensCallback) // <---- EXCEPTION
}
awsconfiguration.json
{
"UserAgent": "aws-amplify-cli/0.1.0",
"Version": "1.0",
"IdentityManager": {
"Default": {}
},
"CredentialsProvider": {
"CognitoIdentity": {
"Default": {
"PoolId": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"Region": "us-east-1"
}
}
},
"CognitoUserPool": {
"Default": {
"PoolId": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"AppClientId": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"AppClientSecret": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"Region": "us-east-1"
}
}
}
The same issue(able to login but not able to fetch tokens) I faced while using with the Amplify API. Fixed By 1.Go to your identity pool and select edit 2.Add your 'user pool' and 'app client' as one of the Auth providerenter image description here
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With