Refresh the access token
(
&self,
client: &Client,
database: &Database,
region: &Region,
telemetry: Option<&crate::telemetry::TelemetryThread>,
)
| 371 | |
| 372 | /// Refresh the access token |
| 373 | pub async fn refresh_token( |
| 374 | &self, |
| 375 | client: &Client, |
| 376 | database: &Database, |
| 377 | region: &Region, |
| 378 | telemetry: Option<&crate::telemetry::TelemetryThread>, |
| 379 | ) -> Result<Option<Self>, AuthError> { |
| 380 | let Some(refresh_token) = &self.refresh_token else { |
| 381 | warn!("no refresh token was found"); |
| 382 | // if the token is expired and has no refresh token, delete it |
| 383 | if let Err(err) = self.delete(database).await { |
| 384 | error!(?err, "Failed to delete builder id token"); |
| 385 | } |
| 386 | |
| 387 | return Ok(None); |
| 388 | }; |
| 389 | |
| 390 | trace!("loading device registration from secret store"); |
| 391 | let registration = match DeviceRegistration::load_from_secret_store(database, region).await? { |
| 392 | Some(registration) if registration.oauth_flow == self.oauth_flow => registration, |
| 393 | // If the OIDC client registration is for a different oauth flow or doesn't exist, then |
| 394 | // we can't refresh the token. |
| 395 | Some(registration) => { |
| 396 | warn!( |
| 397 | "Unable to refresh token: Stored client registration has oauth flow: {:?} but current access token has oauth flow: {:?}", |
| 398 | registration.oauth_flow, self.oauth_flow |
| 399 | ); |
| 400 | return Ok(None); |
| 401 | }, |
| 402 | None => { |
| 403 | warn!("Unable to refresh token: No registered client was found"); |
| 404 | return Ok(None); |
| 405 | }, |
| 406 | }; |
| 407 | |
| 408 | debug!("Refreshing access token"); |
| 409 | match client |
| 410 | .create_token() |
| 411 | .client_id(registration.client_id) |
| 412 | .client_secret(registration.client_secret.0) |
| 413 | .refresh_token(&refresh_token.0) |
| 414 | .grant_type(REFRESH_GRANT_TYPE) |
| 415 | .send() |
| 416 | .await |
| 417 | { |
| 418 | Ok(output) => { |
| 419 | let token: BuilderIdToken = Self::from_output( |
| 420 | output, |
| 421 | region.clone(), |
| 422 | self.start_url.clone(), |
| 423 | self.oauth_flow, |
| 424 | self.scopes.clone(), |
| 425 | ); |
| 426 | debug!("Refreshed access token, new token: {:?}", token); |
| 427 | |
| 428 | if let Err(err) = token.save(database).await { |
| 429 | error!(?err, "Failed to store builder id access token"); |
| 430 | }; |
no test coverage detected