Skip to content

Commit c03a8ed

Browse files
authored
Catch OAuth refresh token errors for generic provider (#1196)
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.
2 parents dc1edca + eb2de63 commit c03a8ed

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)