chore: preserve provider token
This commit is contained in:
parent
25cec9982f
commit
fd22e1d472
|
|
@ -273,13 +273,18 @@ impl Client {
|
|||
.split('&');
|
||||
|
||||
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 {
|
||||
match param.split_once('=') {
|
||||
Some(pair) => {
|
||||
let (k, v) = pair;
|
||||
if k == "refresh_token" {
|
||||
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),
|
||||
|
|
@ -287,13 +292,18 @@ impl Client {
|
|||
}
|
||||
let refresh_token = refresh_token.ok_or(url_missing_param("refresh_token"))?;
|
||||
|
||||
let new_token = self
|
||||
let mut new_token = self
|
||||
.gotrue_client
|
||||
.token(&Grant::RefreshToken(RefreshTokenGrant {
|
||||
refresh_token: refresh_token.to_owned(),
|
||||
}))
|
||||
.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?;
|
||||
self.token.write().set(new_token);
|
||||
Ok(new)
|
||||
|
|
|
|||
|
|
@ -47,18 +47,26 @@ impl Action for RefreshTokenAction {
|
|||
if let (Some(token), Some(gotrue_client)) =
|
||||
(weak_token.upgrade(), weak_gotrue_client.upgrade())
|
||||
{
|
||||
let refresh_token = token
|
||||
.read()
|
||||
.as_ref()
|
||||
.ok_or(GoTrueError::NotLoggedIn(
|
||||
let (refresh_token, provider_access_token, provider_refresh_token) = {
|
||||
let mut token_write = token.write();
|
||||
let gotrue_resp_token = token_write.as_mut().ok_or(GoTrueError::NotLoggedIn(
|
||||
"fail to refresh user token".to_owned(),
|
||||
))?
|
||||
.refresh_token
|
||||
.as_str()
|
||||
.to_owned();
|
||||
let access_token_resp = gotrue_client
|
||||
))?;
|
||||
let refresh_token = gotrue_resp_token.refresh_token.as_str().to_owned();
|
||||
let provider_access_token = gotrue_resp_token.provider_access_token.take();
|
||||
let provider_refresh_token = gotrue_resp_token.provider_refresh_token.take();
|
||||
(refresh_token, provider_access_token, provider_refresh_token)
|
||||
};
|
||||
|
||||
let mut access_token_resp = gotrue_client
|
||||
.token(&Grant::RefreshToken(RefreshTokenGrant { refresh_token }))
|
||||
.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);
|
||||
}
|
||||
Ok(())
|
||||
|
|
|
|||
Loading…
Reference in New Issue