Как продлить срок действия маркера доступа или идентификатора на 10 лет, как написано в документации? - PullRequest
1 голос
/ 27 июня 2019

Я использую Amazon Cognito для аутентификации и хочу попросить, чтобы срок действия моего токена доступа и токена идентификатора истек примерно через час, кроме того, я прошел через многие ответы, которые они сказали использовать токен обновления, поскольку они имеют срок действия 10 лет, так что мой вопрос, как использовать токен обновления в Android?

Прямо сейчас после входа в систему я устанавливаю CognitoCachingCredentialProvider карту входа в систему для токена - и я использую как Facebook, так и адрес электронной почты для входа.

val authenticationHandler = object : AuthenticationHandler {
            override fun onSuccess(userSession: CognitoUserSession?, newDevice: CognitoDevice?) {

            //After Authentication User  Cognito Access Id and Access Secret Extraction
            currentSession = userSession!!

            //Getting Session Token
            val id = currentSession.idToken.jwtToken
            //Credential Provider
            val cognitoCachingCredentialsProvider = CognitoCachingCredentialsProvider(this@LoginActivity,resources.getString(R.string.cognito_identity_pool_id),Regions.myRegion)
            cognitoCachingCredentialsProvider.clear()
            //Login Map

            val login = HashMap<String,String>()
            login["myString"] = id
            cognitoCachingCredentialsProvider.logins = login
            //Off the main thread
            SimpleAsyncTask(this@LoginActivity,cognitoCachingCredentialsProvider).execute()
        }

        override fun authenticationChallenge(continuation: ChallengeContinuation?) {
            continuation?.continueTask()
        }

        override fun getAuthenticationDetails(authenticationContinuation: AuthenticationContinuation, userId: String) {
            // The API needs user sign-in credentials to continue
            Log.d(TAG, "userId is : $userId")
            val authenticationDetails = AuthenticationDetails(userId, password, null)
            authenticationDetails.authenticationType = "USER_PASSWORD"

            // Pass the user sign-in credentials to the continuation
            authenticationContinuation.setAuthenticationDetails(authenticationDetails)

            // Allow the sign-in to continue
            authenticationContinuation.continueTask()
        }

        override fun getMFACode(multiFactorAuthenticationContinuation: MultiFactorAuthenticationContinuation) {
            // Multi-factor authentication is required; get the verification code from user
            multiFactorAuthenticationContinuation.setMfaCode(null)
            // Allow the sign-in process to continue
            multiFactorAuthenticationContinuation.continueTask()
        }

        override fun onFailure(exception: Exception) {
            // Sign-in failed, check exception for the cause
            Log.e(TAG, "${exception.message}")
        }
    }
    // Sign in the user
    user.getSessionInBackground(authenticationHandler)
}
internal class SimpleAsyncTask(private val activity: Activity,private val credential:CognitoCachingCredentialsProvider) :
        AsyncTask<Void, Void, Void>() {
    override fun doInBackground(vararg p0: Void?):Void ?{
        credential.refresh()
        credential.setPersistenceEnabled(true)
        return null
    }

Подобный код также используется для входа в Facebook, как это

FacebookCallback<LoginResult> {
                        override fun onSuccess(loginResult: LoginResult) {




                        //Getting access Token

                        val accessToken = loginResult.accessToken.token

                        //Credentials Extraction
                        val credentials = CognitoCachingCredentialsProvider(this@LoginActivity,resources.getString(R.string.cognito_identity_pool_id),Regions.myRegion)
                        credentials.clear()
                        //Map of login
                        val login = HashMap<String,String>()
                        login["graph.facebook.com"] = accessToken

                        //Setting the value of map
                        credentials.logins = login


                        //Off the main thread
                        SimpleAsyncTask(this@LoginActivity,credentials).execute()

                    }

                    override fun onCancel() {

                        //Cancel code
                        Toast.makeText(this@LoginActivity,"Canceled",Toast.LENGTH_SHORT).show()

                    }

                    override fun onError(exception: FacebookException) {
                        //Error code
                        Toast.makeText(this@LoginActivity,exception.toString(),Toast.LENGTH_SHORT).show()
                    }
                })

Теперь я использую это для проверки статуса пользователя при входе, проверяю условие cognitoCachingCredentialProvider.cachedId!=null для проверки имени пользователя. Но в течение часа он входит в систему как пользователь может войти в систему на долгое время

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Хорошо, так как Нинад сказал, что мы должны использовать getSession для обновления учетных данных, вам нужно просто добавить эту проверку.

     if(credentialsProvider.cachedIdentityId==null)
             {
userPool.currentUser.getSessionInBackground(AuthenticationHandler)
}

Сделайте для этого отдельный обработчик аутентификации, и ваши токены будут обновлены.

0 голосов
/ 27 июня 2019

Токен обновления явно отличается от идентификатора или токена доступа. Вы можете использовать токен обновления, чтобы получить новые токены доступа и идентификатора (как следует из названия). Когда вы вызываете getSession, он должен автоматически обновить ваши токены, если срок их действия истек И если срок действия вашего маркера обновления не истек.

Дополнительная информация: https://stackoverflow.com/a/39480690/6941447

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...