Skip to content

Commit 998bf60

Browse files
authored
attempt to parse token errors on refresh failures (#472)
1 parent 3b63a6c commit 998bf60

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

sdk/identity/src/errors.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//! Errors specific to identity services.
22
use serde::{Deserialize, Serialize};
3+
use std::fmt;
34

45
#[non_exhaustive]
56
#[derive(Debug, thiserror::Error)]
@@ -39,3 +40,26 @@ pub(crate) enum ErrorResponse {
3940
/// An unrecognized error response from an identity service.
4041
GenericError { error_description: String },
4142
}
43+
44+
/// Error Token
45+
#[derive(Debug, Clone, Deserialize)]
46+
pub struct ErrorToken {
47+
error: String,
48+
error_description: String,
49+
error_codes: Vec<i64>,
50+
timestamp: Option<String>,
51+
trace_id: Option<String>,
52+
correlation_id: Option<String>,
53+
suberror: Option<String>,
54+
claims: Option<String>,
55+
}
56+
57+
impl fmt::Display for ErrorToken {
58+
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
59+
writeln!(f, "error: {}", self.error)?;
60+
if let Some(suberror) = &self.suberror {
61+
writeln!(f, "suberror: {}", suberror)?;
62+
}
63+
writeln!(f, "description: {}", self.error_description)
64+
}
65+
}

sdk/identity/src/refresh_token.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
//! Refresh token utilities
22
3-
use crate::traits::{BearerToken, ExtExpiresIn, RefreshToken};
3+
use crate::{
4+
errors::ErrorToken,
5+
traits::{BearerToken, ExtExpiresIn, RefreshToken},
6+
};
47
use log::debug;
58
use oauth2::{AccessToken, ClientId, ClientSecret};
69
use serde::Deserialize;
@@ -19,6 +22,8 @@ pub enum Error {
1922
DeserializeError(serde_json::Error),
2023
#[error("Error parsing url for refresh token: {0}")]
2124
ParseUrlError(url::ParseError),
25+
#[error("Error requesting token: {0}")]
26+
TokenError(ErrorToken),
2227
}
2328

2429
/// Exchange a refresh token for a new access token and refresh token
@@ -59,9 +64,19 @@ pub async fn exchange(
5964
.text()
6065
.await
6166
.map_err(Error::TextError)?;
62-
debug!("{}", ret);
6367

64-
Ok(ret.try_into().map_err(Error::DeserializeError)?)
68+
debug!("refresh token response: {:?}", ret);
69+
70+
match serde_json::from_str::<RefreshTokenResponse>(&ret).map_err(Error::DeserializeError) {
71+
Ok(r) => Ok(r),
72+
Err(e) => {
73+
if let Ok(token_error) = serde_json::from_str::<ErrorToken>(&ret) {
74+
Err(Error::TokenError(token_error))
75+
} else {
76+
Err(e)
77+
}
78+
}
79+
}
6580
}
6681

6782
/// A refresh token

0 commit comments

Comments
 (0)