From 92d33ad0a325b8cb7c78e13a344621e34fb4bd99 Mon Sep 17 00:00:00 2001 From: mat Date: Sat, 16 Dec 2023 13:54:57 -0600 Subject: [PATCH] force user to reauth when refresh fails --- azalea-auth/src/auth.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/azalea-auth/src/auth.rs b/azalea-auth/src/auth.rs index 68b03306..3b55a3bd 100755 --- a/azalea-auth/src/auth.rs +++ b/azalea-auth/src/auth.rs @@ -10,6 +10,7 @@ use std::{ time::{Instant, SystemTime, UNIX_EPOCH}, }; use thiserror::Error; +use tracing::trace; use uuid::Uuid; #[derive(Default)] @@ -84,7 +85,14 @@ pub async fn auth(email: &str, opts: AuthOpts) -> Result }; if msa.is_expired() { tracing::trace!("refreshing Microsoft auth token"); - msa = refresh_ms_auth_token(&client, &msa.data.refresh_token).await?; + match refresh_ms_auth_token(&client, &msa.data.refresh_token).await { + Ok(new_msa) => msa = new_msa, + Err(e) => { + // can't refresh, ask the user to auth again + tracing::error!("Error refreshing Microsoft auth token: {}", e); + msa = interactive_get_ms_auth_token(&client, email).await?; + } + } } let msa_token = &msa.data.access_token; @@ -361,13 +369,15 @@ pub async fn interactive_get_ms_auth_token( pub enum RefreshMicrosoftAuthTokenError { #[error("Http error: {0}")] Http(#[from] reqwest::Error), + #[error("Error parsing JSON: {0}")] + Json(#[from] serde_json::Error), } pub async fn refresh_ms_auth_token( client: &reqwest::Client, refresh_token: &str, ) -> Result, RefreshMicrosoftAuthTokenError> { - let access_token_response = client + let access_token_response_text = client .post("https://login.live.com/oauth20_token.srf") .form(&vec![ ("scope", "service::user.auth.xboxlive.com::MBI_SSL"), @@ -377,8 +387,10 @@ pub async fn refresh_ms_auth_token( ]) .send() .await? - .json::() + .text() .await?; + let access_token_response: AccessTokenResponse = + serde_json::from_str(&access_token_response_text)?; let expires_at = SystemTime::now() + std::time::Duration::from_secs(access_token_response.expires_in);