Я пытаюсь разобраться в этом уже больше недели, но не вижу, в чем заключается проблема в моем процессе. Я создаю мобильное приложение для Android, используя Kotlin. Моя текущая цель — выдать себя за пользователя и создать событие календаря в календаре Google, используя лямбда-функцию в AWS. У меня уже есть эта настройка аспекта. Однако для того, чтобы добавить событие календаря с помощью лямбда-функции, мне нужно иметь код аутентификации и токен доступа. Поэтому при входе в Google при использовании приложения я хочу перенести код аутентификации и токен доступа для последующего использования в моем приложении. Однако у меня возникли проблемы с HTTP 400, из-за которых возникла неверная ошибка кода аутентификации. Но я проверил форматирование и не вижу, в чем проблема в моем коде и конфигурации.
При входе в систему с использованием 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")
}
После этого я перехожу к классу ProfileActivity, чтобы обменять код аутентификации на токен доступа, чтобы позже с помощью функций приложения использовать токен доступа и код аутентификации, чтобы выдать себя за пользователя и создать событие календаря в календаре Google.
Возможно, мне нужно установить области действия в googleIdOption? Что я могу сделать, чтобы попытаться поместить код аутентификации в правильный формат для обмена кодом аутентификации для токенов обновления и доступа?
РЕДАКТИРОВАТЬ:
Я изменил поле для моей функции ExchangeAuthCodeForTokens на включите область, где я определил область, включающую userinfo.profile и userinfo.email, и это не исправило неверную ошибку кода аутентификации. Я не знаю, что делать, чтобы решить эту проблему.
interface GoogleAuthService {
@FormUrlEncoded
@POST("token")
suspend fun exchangeCodeForToken(
@Field("code") code: String,
@Field("client_id") clientId: String,
@Field("client_secret") clientSecret: String,
@Field("redirect_uri") redirectUri: String,
@Field("grant_type") grantType: String,
@Field("scope") scope:String
): TokenResponse
}
data class TokenResponse(
@SerializedName("access_token") val accessToken: String,
@SerializedName("expires_in") val expiresIn: String,
@SerializedName("refresh_token") val refreshToken: String?,
@SerializedName("scope") val scope: String,
@SerializedName("token_type") val tokenType: String
)
Подробнее здесь: https://stackoverflow.com/questions/786 ... r-tokens-o
Неверный код аутентификации HTTP 400 во время обмена кодом аутентификации Google OAuth для токенов в приложении Android ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Неверный запрос HTTP 400 – неверный заголовок при модернизации на Android
Anonymous » » в форуме Android - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-