Return a valid access token, refreshing if necessary. Returns `None` if no tokens are stored (the caller should initiate the auth flow).
(&self)
| 287 | /// Returns `None` if no tokens are stored (the caller should initiate the |
| 288 | /// auth flow). |
| 289 | pub async fn get_token(&self) -> Result<Option<String>, OAuthError> { |
| 290 | let entry = match auth::get_for_url(&self.mcp_name, &self.server_url).await { |
| 291 | Some(e) => e, |
| 292 | None => return Ok(None), |
| 293 | }; |
| 294 | |
| 295 | let tokens = match &entry.tokens { |
| 296 | Some(t) => t, |
| 297 | None => return Ok(None), |
| 298 | }; |
| 299 | |
| 300 | // Check expiry (with a 60-second buffer). |
| 301 | if let Some(exp) = tokens.expires_at { |
| 302 | let now = std::time::SystemTime::now() |
| 303 | .duration_since(std::time::UNIX_EPOCH) |
| 304 | .unwrap_or_default() |
| 305 | .as_secs_f64(); |
| 306 | if exp < now + 60.0 { |
| 307 | if tokens.refresh_token.is_some() { |
| 308 | self.refresh_token().await?; |
| 309 | if let Some(refreshed) = |
| 310 | auth::get_for_url(&self.mcp_name, &self.server_url).await |
| 311 | { |
| 312 | if let Some(t) = refreshed.tokens { |
| 313 | return Ok(Some(t.access_token)); |
| 314 | } |
| 315 | } |
| 316 | } |
| 317 | return Ok(None); |
| 318 | } |
| 319 | } |
| 320 | |
| 321 | Ok(Some(tokens.access_token.clone())) |
| 322 | } |
| 323 | |
| 324 | /// Remove all stored OAuth credentials for this server. |
| 325 | pub async fn remove_auth(&self) -> Result<(), OAuthError> { |
no test coverage detected