{"record":{"id":"b2716aa178b5dbf0","repo":"zeroclaw-labs/zeroclaw","slug":"google-oauth-token-exchange-failed","errorCode":null,"errorMessage":"Google OAuth token exchange failed ({}): {}","messagePattern":"Google OAuth token exchange failed \\((.+?)\\): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-providers/src/auth/gemini_oauth.rs","lineNumber":132,"sourceCode":"        .send()\n        .await\n        .context(\"Failed to send token exchange request\")?;\n\n    let status = response.status();\n    let body = response\n        .text()\n        .await\n        .context(\"Failed to read token response body\")?;\n\n    if !status.is_success() {\n        if let Ok(err) = serde_json::from_str::<OAuthErrorResponse>(&body) {\n            anyhow::bail!(\n                \"Google OAuth error: {} - {}\",\n                err.error,\n                err.error_description.unwrap_or_default()\n            );\n        }\n        anyhow::bail!(\"Google OAuth token exchange failed ({}): {}\", status, body);\n    }\n\n    let token_response: TokenResponse =\n        serde_json::from_str(&body).context(\"Failed to parse token response\")?;\n\n    let expires_at = token_response\n        .expires_in\n        .map(|secs| Utc::now() + chrono::Duration::seconds(secs));\n\n    Ok(TokenSet {\n        access_token: token_response.access_token,\n        refresh_token: token_response.refresh_token,\n        id_token: token_response.id_token,\n        expires_at,\n        token_type: token_response.token_type.or_else(|| Some(\"Bearer\".into())),\n        scope: token_response.scope,\n    })\n}","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-providers/src/auth/gemini_oauth.rs#L114-L150","documentation":"Error \"Google OAuth token exchange failed ({}): {}\" thrown in zeroclaw-labs/zeroclaw.","triggerScenarios":"Thrown at crates/zeroclaw-providers/src/auth/gemini_oauth.rs:132 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Verify the authorization code, redirect URI, and client credentials; retry the token exchange."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}