getTokenResponse method

Future<TokenResponse> getTokenResponse([
  1. bool forceRefresh = false
])

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;
  }
}