updateToken method

Future<void> updateToken([
  1. Duration? duration
])

Requests a new access token if it expires within the given duration.

Implementation

Future<void> updateToken([Duration? duration]) async {
  final securedRefreshToken =
      await _secureStorage.read(key: _refreshTokenKey);

  if (securedRefreshToken == null) {
    developer.log('No refresh token found.', name: 'keycloak_wrapper');
    _streamController.add(false);
  } else if (JWT
      .decode(securedRefreshToken)
      .willExpired(duration ?? Duration.zero)) {
    developer.log('Expired refresh token', name: 'keycloak_wrapper');
    _streamController.add(false);
  } else {
    final isConnected = await hasNetwork();

    if (isConnected) {
      tokenResponse = await _appAuth.token(
        TokenRequest(
          _keycloakConfig.clientId,
          _keycloakConfig.redirectUri,
          issuer: _keycloakConfig.issuer,
          scopes: _keycloakConfig.scopes,
          refreshToken: securedRefreshToken,
          allowInsecureConnections: _keycloakConfig.allowInsecureConnections,
          clientSecret: _keycloakConfig.clientSecret,
        ),
      );

      if (tokenResponse.isValid) {
        if (refreshToken != null) {
          await _secureStorage.write(
            key: _refreshTokenKey,
            value: refreshToken,
          );
        }
      } else {
        developer.log('Invalid token response.', name: 'keycloak_wrapper');
      }

      _streamController.add(tokenResponse.isValid);
    } else {
      developer.log('No internet connection.', name: 'keycloak_wrapper');
      _streamController.add(true);
    }
  }
}