Я использую менеджер аккаунтов Android для обработки аутентификации в моем приложении. Документация говорит:
Если для вашей активности аутентификатора требуются какие-либо специальные параметры инициализации, вы можете присоединить их к намерению с помощью Intent.putExtra ().
Но в моей деятельности дополнительные значения всегда равны нулю.
Это мой класс Authenticator:
Метод addAccount:
override fun addAccount(
response: AccountAuthenticatorResponse?,
accountType: String?,
authTokenType: String?,
requiredFeatures: Array<out String>?,
options: Bundle?
): Bundle {
val result = Bundle()
val account = AuthenticationHelper.findAccount()
account?.let {
result.addErrorMessage(
context.resources?.getString(R.string.account_number_exceeded),
AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION
)
handler.post { Toast.makeText(context, R.string.account_number_exceeded, Toast.LENGTH_LONG).show() }
return result
}
val intent = createAuthenticatorActivity(response, true)
result.putParcelable(AccountManager.KEY_INTENT, intent)
return result
}
getAuthTokenМетод:
override fun getAuthToken(
response: AccountAuthenticatorResponse?,
account: Account?,
authTokenType: String?,
options: Bundle?
): Bundle {
val result = Bundle()
if (!checkSignature(options)) {
result.addErrorMessage("Cannot access auth token from other apps.", AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION)
return result
}
// handle when auth token type is not valid.
if (authTokenType !in arrayOf(
AuthenticationConstants.AUTHTOKEN_TYPE_FULL_ACCESS,
AuthenticationConstants.AUTHTOKEN_TYPE_READ_ONLY
)
) {
handler.post { Toast.makeText(context, R.string.auth_type_not_supported, Toast.LENGTH_LONG).show() }
result.addErrorMessage("Invalid auth token type.", AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION)
return result
}
val authToken = accountManager.peekAuthToken(account, authTokenType)
// if auth token is not empty we return it.
if (!authToken.isNullOrEmpty()) {
result.putString(AccountManager.KEY_ACCOUNT_NAME, account?.name)
result.putString(AccountManager.KEY_ACCOUNT_TYPE, account?.type)
result.putString(AccountManager.KEY_AUTHTOKEN, authToken)
return result
}
// if auth token is empty we try to refresh it.
if (authToken.isNullOrEmpty()) {
val refreshToken = accountManager.getPassword(account)
val username = account?.name ?: ""
// if refresh token is not empty we try to refresh it.
if (!refreshToken.isNullOrBlank()) {
try {
val authData = runBlocking {
val renewTokenRequest = RenewTokenRequest(username, refreshToken)
renewToken(RenewToken.Params(renewTokenRequest))
}
if (!authData.accessToken.isNullOrBlank() && !authData.refreshToken.isNullOrBlank()) {
result.putString(AccountManager.KEY_ACCOUNT_NAME, account?.name)
result.putString(AccountManager.KEY_ACCOUNT_TYPE, account?.type)
result.putString(AccountManager.KEY_AUTHTOKEN, authData.accessToken)
accountManager.setPassword(account, authData.refreshToken)
return result
}
} catch (e: Throwable) {
Log.e("Authentication Error", "Cannot refresh access token.")
e.printStackTrace()
}
}
}
// we re-authenticate if refresh token is empty.
val intent = createAuthenticatorActivity(response, false, account?.name)
result.putParcelable(AccountManager.KEY_INTENT, intent)
return result
}
вспомогательный метод для создания намерения:
private fun createAuthenticatorActivity(
response: AccountAuthenticatorResponse?,
isAddingNewAccount: Boolean,
accountName: String? = null
): Intent {
val intent = AuthenticatorActivity.callingIntent(context)
intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response)
if (isAddingNewAccount) {
intent.putExtra(AuthenticatorActivity.ARG_IS_ADDING_NEW_ACCOUNT, true)
} else {
intent.putExtra(KEY_ACCOUNT_NAME, accountName)
}
return intent
}
Использование intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME)
Я не могу получить имя учетной записи в своей деятельности.В методе getAuthToken я добавляю имя учетной записи в предварительно заполненное поле имени пользователя на экране входа в систему.
Примечание. Моя аутентификация не распространяется на класс AccountAuthenticatorActivity
, потому что я не использую его для установки результата, но я пытался это сделатьтоже, и это не помогло.
Спасибо.