[google-auth-library-java] OAuthException.createFromHttpResponseException throws ClassCastException on a Google API error body, losing the HTTP status and body
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 72/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- Active
- Stack technique
- java
- Domaine
- authentication
Piste de recherche
Start with OAuthException.java:90 and run the deterministic createFromHttpResponseException reproduction using the supplied Google API error body. Trace its callers in StsRequestHandler.exchangeToken and ExternalAccountAuthorizedUserCredentials.java:204, then add regression coverage showing that the response status and body are retained without the ClassCastException, including a body without an error key.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Environment details
- API: auth, workload identity federation (
AwsCredentials, STS token exchange during Cloud Storage calls) - OS type and version: Linux (AWS Lambda and AWS ECS)
- Java version: 25
- Version(s):
google-auth-library-oauth2-http1.50.0 (libraries-bom 26.86.0),google-http-client2.2.0.createFromHttpResponseExceptionis unchanged in 1.53.0 and onmain(05a998f).
Steps to reproduce
- Deterministic, no credentials needed: call
OAuthException.createFromHttpResponseExceptionwith anHttpResponseExceptionwhose content is a Google API error body (snippet below). It throwsClassCastException. - Against the real STS: an
AwsCredentialswhosetoken_urlishttps://sts.googleapis.com/v1/introspectgets HTTP 400 with{"error":{"code":400,"message":"Invalid JSON payload received. ...","status":"INVALID_ARGUMENT"}}and fails with the sameClassCastException. The misconfigured URL is only a way to get that body shape on demand; in production the same exception comes fromhttps://sts.googleapis.com/v1/token.
Code example
package com.google.auth.oauth2;
import com.google.api.client.http.HttpHeaders;
import com.google.api.client.http.HttpResponseException;
class OAuthExceptionNestedErrorRepro {
public static void main(String[] args) throws Exception {
HttpResponseException e =
new HttpResponseException.Builder(400, "Bad Request", new HttpHeaders())
.setContent(
"{\"error\":{\"code\":400,\"message\":\"Request contains an invalid argument.\",\"status\":\"INVALID_ARGUMENT\"}}")
.build();
OAuthException.createFromHttpResponseException(e); // java.lang.ClassCastException
}
}
Stack trace
Production, workload identity federation from AWS, token exchange triggered by a Cloud Storage request:
java.lang.ClassCastException: class com.google.api.client.util.ArrayMap cannot be cast to class java.lang.String
at com.google.auth.oauth2.OAuthException.createFromHttpResponseException(OAuthException.java:90)
at com.google.auth.oauth2.StsRequestHandler.exchangeToken(StsRequestHandler.java:129)
at com.google.auth.oauth2.ExternalAccountCredentials.exchangeExternalCredentialForAccessToken(ExternalAccountCredentials.java:567)
at com.google.auth.oauth2.AwsCredentials.refreshAccessToken(AwsCredentials.java:132)
at com.google.auth.oauth2.OAuth2Credentials.getRequestMetadata(OAuth2Credentials.java:189)
External references such as API reference guides
- https://github.com/bazelbuild/bazel/issues/29600: the same exception from
IdentityPoolCredentials(GitLab CI, workload identity federation), closed as not reproducible. - https://github.com/googleapis/google-cloud-java/pull/14220: contains an equivalent guard in
createFromHttpResponseException, but targets theoauth2-bound-tokensbranch and does not mention this bug.
Any additional information below
OAuthException.java:90castserrortoString. The request-validation errors we could trigger on/v1/tokencome back in the OAuth form ({"error":"invalid_request","error_description":"..."}), but some production responses from/v1/tokencarryerroras an object (Google's API error format), which makes the cast throw. We could not capture those bodies because the library drops them.- The
ClassCastExceptionis thrown from insidecatch (HttpResponseException e)inStsRequestHandler.exchangeToken. It is aRuntimeException, so it escapes theIOExceptioncontract ofrefresh()/getRequestMetadata(), and it has no cause, so theHttpResponseExceptionholding the status and body is lost.LoggingUtilslogs the response only on success, so the body is not logged either. When this happened to us intermittently in production (a burst of failures across several independent GCP projects within minutes), we could not tell whether STS was rate limiting, unavailable, or refusing the credential. - Because the
ClassCastExceptionis not anIOException, google-cloud-storage classifies it as unretryable (Unretryable error (attempts: 1, maxAttempts: 6)), so a transient STS failure is not retried either. - The same method is also called from
ExternalAccountAuthorizedUserCredentials.java:204. - Related: a body without an
errorkey makes the constructor'scheckNotNull(errorCode)throwNullPointerException.
- Langage dominant
- Java
- Étoiles
- 2.1k
- Forks
- 1.2k
- Merge moyen
- 2 j 14 h
- PR mergées (30 j)
- 192
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de googleapis/google-cloud-java
-
[java-core] Timestamp.of(java.sql.Timestamp) is one second late for a time less than a second before the epochPeut-être pris @Vcode2407 l’a pris il y a 4 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
googleapis/google-cloud-java#14636 ·
Les mainteneurs répondent en général sous 1 jour
-
[java-firestore] UserDataConverter encodes a pre-epoch Date with negative nanos, so the write is refusedPeut-être pris @wu-hui l’a pris il y a 23 jours. Ouvertepriority: p2 type: bug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
googleapis/google-cloud-java#14635 · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
[java-firestore] UserDataConverter throws IndexOutOfBoundsException on an empty __binary__ valuePeut-être pris @wu-hui l’a pris il y a 23 jours. Ouvertepriority: p2 type: bug
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
googleapis/google-cloud-java#14634 · 1 commentaire · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
[java-firestore] CustomClassMapper.convertBigDecimal calls .abs() on Double, unintentionally flipping negative values to positivePeut-être à nouveau libre @wu-hui l’a pris il y a 45 jours, et aucune pull request n’est ouverte. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
googleapis/google-cloud-java#14533 · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
Github CI failing when trying to install xmllintPeut-être pris @blakeli0 l’a pris il y a 81 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
googleapis/google-cloud-java#14132 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de googleapis/google-cloud-java
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 80/100
finos/fluxnova-bpm-platform#387 ·
Les mainteneurs répondent en général sous 4 jours
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
-
Difficulté 2/5 Moins d'une heure Accessibilité débutants 84/100
cpp-best-practices/project_validator#251 ·
Les mainteneurs répondent en général sous 1 jour
-
backend enhancement
Difficulté 2/5 Une demi-journée Accessibilité débutants 70/100
damodharg6/payledger#16 ·
-
[Bug]: An initiative list with no current entry logs an error on every changePeut-être pris @dwizard0 l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Les mainteneurs répondent en général sous 1 jour