oauth/v2_0/
refresh_access_token.rs

1//! Refresh Access Token flow helper, as defined in the
2//! [RFC6749](https://datatracker.ietf.org/doc/html/rfc6749#section-6)
3
4use oauth2::{RefreshToken, TokenResponse};
5
6use super::{Client, Error, Result};
7
8/// OAuth 2.0 Refresh Access Token flow builder. The builder is empty
9/// for now but scopes will be added in the future. This flow exchange
10/// a refresh token for a new pair of access token and maybe a refresh
11/// token.
12#[derive(Debug, Default)]
13pub struct RefreshAccessToken;
14
15impl RefreshAccessToken {
16    pub fn new() -> Self {
17        Self
18    }
19
20    pub async fn refresh_access_token(
21        &self,
22        client: &Client,
23        refresh_token: impl ToString,
24    ) -> Result<(String, Option<String>)> {
25        let res = client
26            .exchange_refresh_token(&RefreshToken::new(refresh_token.to_string()))
27            .request_async(&Client::send_oauth2_request)
28            .await
29            .map_err(Box::new)
30            .map_err(Error::RefreshAccessTokenError)?;
31
32        let access_token = res.access_token().secret().to_owned();
33        let refresh_token = res.refresh_token().map(|t| t.secret().clone());
34
35        Ok((access_token, refresh_token))
36    }
37}