getTokenResponse method
Implementation
Future<TokenResponse> getTokenResponse([bool forceRefresh = false]) async {
if (_token.accessToken == null && _token.refreshToken == null) {
return _token;
}
if (_getTokenResponseCompleter != null) {
return _getTokenResponseCompleter!.future;
}
// Check if token is still valid BEFORE creating completer to avoid
// leaving an incomplete completer that concurrent calls would wait on
if (!forceRefresh &&
_token.accessToken != null &&
(_token.expiresAt == null ||
_token.expiresAt!.isAfter(DateTime.now()))) {
return _token;
}
_getTokenResponseCompleter = Completer();
try {
var grantType = _token.refreshToken != null
? 'refresh_token'
: 'client_credentials'; // TODO: make this selection more explicit
var json = await http.post(client.issuer.tokenEndpoint,
body: {
'grant_type': grantType,
if (grantType == 'refresh_token')
'refresh_token': _token.refreshToken,
if (grantType == 'client_credentials')
'scope': _token.toJson()['scope'],
'client_id': client.clientId,
if (client.clientSecret != null)
'client_secret': client.clientSecret
},
client: client.httpClient);
updateToken(json);
_getTokenResponseCompleter!.complete(_token);
return _token;
} catch (error) {
_getTokenResponseCompleter!.completeError(error);
rethrow;
} finally {
_getTokenResponseCompleter = null;
}
}