diff --git a/lib/oauth2_helper.dart b/lib/oauth2_helper.dart index 6d4cd35..0fb2fd7 100644 --- a/lib/oauth2_helper.dart +++ b/lib/oauth2_helper.dart @@ -146,17 +146,31 @@ class OAuth2Helper { return tknResp; } - /// Performs a refresh_token request using the [refreshToken]. Future refreshToken(String refreshToken) async { var tknResp; - try { tknResp = await client.refreshToken(refreshToken, clientId: clientId, clientSecret: clientSecret); } catch (_) { + // infinite loop of refreshToken() method call if auth server revoke the refresh token. + if (RetryControl.retryCount > RetryControl.MAX_RETRY) { + RetryControl.retryCount = 0; + // throw OAuth2Exception('Unexpected error'); + if (tknResp.error == 'invalid_grant') { + //The refresh token is expired too + await tokenStorage.deleteAllTokens(); + //Fetch another access token + tknResp = await getToken(); + } else { + throw OAuth2Exception(tknResp.error, + errorDescription: tknResp.errorDescription); + } + } + RetryControl.retryCount++; return await fetchToken(); } + RetryControl.retryCount = 0; if (tknResp == null) { throw OAuth2Exception('Unexpected error'); @@ -169,7 +183,8 @@ class OAuth2Helper { } else { if (tknResp.error == 'invalid_grant') { //The refresh token is expired too - await tokenStorage.deleteToken(scopes ?? []); + // await tokenStorage.deleteToken(scopes ?? []); // this will not clear your refresh token and lead to infinite loop calling of refreshToken() method + await tokenStorage.deleteAllTokens(); //Fetch another access token tknResp = await getToken(); } else { @@ -334,3 +349,9 @@ class OAuth2Helper { } } } + +class RetryControl { + static int retryCount = 0; + static int MAX_RETRY = 3; +} +