При входе в систему с использованием OAuth я получаю код аутентификации в формате JWT. Я могу декодировать код аутентификации и заметить, что в моей полезной нагрузке атрибут aud имеет то же значение идентификатора клиента, которое я использую, чтобы попытаться обменять код на токен. Я скопировал и вставил идентификатор клиента, а также секреты клиента и URI перенаправления, связанный с моим веб-клиентом Google OAuth. Учитывая эту информацию, я предполагаю, что у меня правильный идентификатор клиента, секретный код клиента, правильный URI перенаправления, и мой код аутентификации, похоже, находится в хорошем состоянии.
При декодировании код аутентификации, я не заметил никаких проблем с подписью или заголовком, полезная нагрузка была правильной, насколько я мог видеть, я попросил чатгпт проверить, просто чтобы убедиться, и здесь все в порядке.
Это код, в котором я допускаю ошибку:
Код: Выделить всё
val tokenResponse = googleAuthService.exchangeCodeForToken(
code = authCode,
clientId = "CLIENT ID pasted from credentials",
clientSecret = "CLIENT SECRETS pasted from credentials",
redirectUri = "FIREBASE URI pasted from credentials",
grantType = "authorization_code"
)
Код: Выделить всё
HTTP 400 Error: {"error": "invalid_grant","error_description": "Malformed auth code."}
Поэтому похоже, что проблема связана с самим кодом аутентификации.
Итак, на данный момент у меня сложилось впечатление что мой идентификатор клиента, мой секрет клиента, мой URI перенаправления и мой тип предоставления верны.
Я вижу, что проблема связана с инициализирующим запросом, где, возможно, мне нужно указать области действия? Но поскольку предыдущий метод устарел, у меня возникли проблемы с setScope, который был рекомендован для chatgpt.
Возможно, мне нужно указать области действия во время инициализацииCredentialRequest? В настоящее время я использую это:
Код: Выделить всё
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId("CLIENT ID")
.setAutoSelectEnabled(true)
.build()
val request = GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()
Код: Выделить всё
is CustomCredential -> {
if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
try {
// Use googleIdTokenCredential and extract id to validate and
// authenticate on your server.
val googleIdTokenCredential = GoogleIdTokenCredential
.createFrom(credential.data)
// Get ID token and email from the credential
val idToken = googleIdTokenCredential.idToken
val email = googleIdTokenCredential.id
Log.e(ProfileActivity.TAG,"idToken: $idToken")
if (idToken != null && email != null) {
val intent = Intent(this@SignInActivity, ProfileActivity::class.java).apply {
putExtra("id_token", idToken)
putExtra("email", email)
}
startActivity(intent)
finish()
} else {
Log.e(TAG, "ID token or email is null")
}
} catch (e: GoogleIdTokenParsingException) {
Log.e(TAG, "Received an invalid google id token response", e)
}
} else {
// Catch any unrecognized custom credential type here.
Log.e(TAG, "Unexpected type of credential")
}
}
else -> {
// Catch any unrecognized credential type here.
Log.e(TAG, "Unexpected type of credential")
}
Возможно, мне нужно установить области действия в googleIdOption? Что я могу сделать, чтобы попытаться поместить код аутентификации в правильный формат для обмена кодом аутентификации для токенов обновления и доступа?
РЕДАКТИРОВАТЬ:
Я изменил поле для моей функции ExchangeAuthCodeForTokens на включите область, где я определил область, включающую userinfo.profile и userinfo.email, и это не исправило неверную ошибку кода аутентификации. Я не знаю, что делать, чтобы решить эту проблему.
Подробнее здесь: https://stackoverflow.com/questions/786 ... r-tokens-o