Skip to content

Commit eb2de63

Browse files
committed
generic: catch OAuth refresh token errors
In case we have an existing refresh token, but it has expired or been revoked, we should gracefully fall back to performing an interactive OAuth flow.
1 parent dc1edca commit eb2de63

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

src/shared/Core/GenericHostProvider.cs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,26 @@ private async Task<ICredential> GetOAuthAccessToken(Uri remoteUri, string userNa
143143
ICredential refreshToken = Context.CredentialStore.Get(refreshService, userName);
144144
if (refreshToken != null)
145145
{
146-
var refreshResult = await client.GetTokenByRefreshTokenAsync(refreshToken.Password, CancellationToken.None);
146+
try
147+
{
148+
var refreshResult = await client.GetTokenByRefreshTokenAsync(refreshToken.Password, CancellationToken.None);
147149

148-
// Store new refresh token if we have been given one
149-
if (!string.IsNullOrWhiteSpace(refreshResult.RefreshToken))
150-
{
151-
Context.CredentialStore.AddOrUpdate(refreshService, refreshToken.Account, refreshToken.Password);
152-
}
150+
// Store new refresh token if we have been given one
151+
if (!string.IsNullOrWhiteSpace(refreshResult.RefreshToken))
152+
{
153+
Context.CredentialStore.AddOrUpdate(refreshService, refreshToken.Account, refreshToken.Password);
154+
}
153155

154-
// Return the new access token
155-
return new GitCredential(oauthUser,refreshResult.AccessToken);
156+
// Return the new access token
157+
return new GitCredential(oauthUser,refreshResult.AccessToken);
158+
}
159+
catch (OAuth2Exception ex)
160+
{
161+
// Failed to use refresh token. It may have expired or been revoked.
162+
// Fall through to an interactive OAuth flow.
163+
Context.Trace.WriteLine("Failed to use refresh token.");
164+
Context.Trace.WriteException(ex);
165+
}
156166
}
157167

158168
// Determine which interactive OAuth mode to use. Start by checking for mode preference in config

0 commit comments

Comments
 (0)