chore: preserve provider token

This commit is contained in:
Zack Fu Zi Xiang 2024-09-02 21:13:33 +08:00
parent 25cec9982f
commit fd22e1d472
No known key found for this signature in database
2 changed files with 29 additions and 11 deletions

View File

@ -273,13 +273,18 @@ impl Client {
.split('&'); .split('&');
let mut refresh_token: Option<&str> = None; let mut refresh_token: Option<&str> = None;
let mut provider_token: Option<String> = None;
let mut provider_refresh_token: Option<String> = None;
for param in key_value_pairs { for param in key_value_pairs {
match param.split_once('=') { match param.split_once('=') {
Some(pair) => { Some(pair) => {
let (k, v) = pair; let (k, v) = pair;
if k == "refresh_token" { if k == "refresh_token" {
refresh_token = Some(v); refresh_token = Some(v);
break; } else if k == "provider_token" {
provider_token = Some(v.to_string());
} else if k == "provider_refresh_token" {
provider_refresh_token = Some(v.to_string());
} }
}, },
None => warn!("param is not in key=value format: {}", param), None => warn!("param is not in key=value format: {}", param),
@ -287,13 +292,18 @@ impl Client {
} }
let refresh_token = refresh_token.ok_or(url_missing_param("refresh_token"))?; let refresh_token = refresh_token.ok_or(url_missing_param("refresh_token"))?;
let new_token = self let mut new_token = self
.gotrue_client .gotrue_client
.token(&Grant::RefreshToken(RefreshTokenGrant { .token(&Grant::RefreshToken(RefreshTokenGrant {
refresh_token: refresh_token.to_owned(), refresh_token: refresh_token.to_owned(),
})) }))
.await?; .await?;
// refresh endpoint does not return provider token
// so we need to set it manually to preserve this information
new_token.provider_access_token = provider_token;
new_token.provider_refresh_token = provider_refresh_token;
let (_user, new) = self.verify_token(&new_token.access_token).await?; let (_user, new) = self.verify_token(&new_token.access_token).await?;
self.token.write().set(new_token); self.token.write().set(new_token);
Ok(new) Ok(new)

View File

@ -47,18 +47,26 @@ impl Action for RefreshTokenAction {
if let (Some(token), Some(gotrue_client)) = if let (Some(token), Some(gotrue_client)) =
(weak_token.upgrade(), weak_gotrue_client.upgrade()) (weak_token.upgrade(), weak_gotrue_client.upgrade())
{ {
let refresh_token = token let (refresh_token, provider_access_token, provider_refresh_token) = {
.read() let mut token_write = token.write();
.as_ref() let gotrue_resp_token = token_write.as_mut().ok_or(GoTrueError::NotLoggedIn(
.ok_or(GoTrueError::NotLoggedIn(
"fail to refresh user token".to_owned(), "fail to refresh user token".to_owned(),
))? ))?;
.refresh_token let refresh_token = gotrue_resp_token.refresh_token.as_str().to_owned();
.as_str() let provider_access_token = gotrue_resp_token.provider_access_token.take();
.to_owned(); let provider_refresh_token = gotrue_resp_token.provider_refresh_token.take();
let access_token_resp = gotrue_client (refresh_token, provider_access_token, provider_refresh_token)
};
let mut access_token_resp = gotrue_client
.token(&Grant::RefreshToken(RefreshTokenGrant { refresh_token })) .token(&Grant::RefreshToken(RefreshTokenGrant { refresh_token }))
.await?; .await?;
// refresh does not preserve provider token and refresh token
// so we need to set it manually to preserve this information
access_token_resp.provider_access_token = provider_access_token;
access_token_resp.provider_refresh_token = provider_refresh_token;
token.write().set(access_token_resp); token.write().set(access_token_resp);
} }
Ok(()) Ok(())