chore: preserve provider token
This commit is contained in:
parent
25cec9982f
commit
fd22e1d472
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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(())
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue