MCPcopy Create free account
hub / github.com/aws/amazon-q-developer-cli / refresh_token

Method refresh_token

crates/chat-cli/src/auth/builder_id.rs:373–469  ·  view source on GitHub ↗

Refresh the access token

(
        &self,
        client: &Client,
        database: &Database,
        region: &Region,
        telemetry: Option<&crate::telemetry::TelemetryThread>,
    )

Source from the content-addressed store, hash-verified

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 };

Callers 1

loadMethod · 0.45

Calls 14

client_secretMethod · 0.80
create_tokenMethod · 0.80
token_typeMethod · 0.80
mapMethod · 0.80
errMethod · 0.80
to_stringMethod · 0.80
send_auth_failedMethod · 0.80
deleteMethod · 0.45
sendMethod · 0.45
client_idMethod · 0.45
cloneMethod · 0.45
saveMethod · 0.45

Tested by

no test coverage detected