@@ -143,16 +143,26 @@ private async Task<ICredential> GetOAuthAccessToken(Uri remoteUri, string userNa
143
143
ICredential refreshToken = Context . CredentialStore . Get ( refreshService , userName ) ;
144
144
if ( refreshToken != null )
145
145
{
146
- var refreshResult = await client . GetTokenByRefreshTokenAsync ( refreshToken . Password , CancellationToken . None ) ;
146
+ try
147
+ {
148
+ var refreshResult = await client . GetTokenByRefreshTokenAsync ( refreshToken . Password , CancellationToken . None ) ;
147
149
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
+ }
153
155
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
+ }
156
166
}
157
167
158
168
// Determine which interactive OAuth mode to use. Start by checking for mode preference in config
0 commit comments