@@ -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