refreshGrant method

Future<ConnectanumHttpAuthGrant> refreshGrant(
  1. ConnectanumHttpAuthGrant grant, {
  2. Map<String, String> headers = const <String, String>{},
})

Refreshes grant at its exact issuing endpoint while requiring the replacement authorization lineage to match it exactly.

Use refreshToken only when the caller intentionally has no prior grant metadata to bind.

Implementation

Future<ConnectanumHttpAuthGrant> refreshGrant(
  ConnectanumHttpAuthGrant grant, {
  Map<String, String> headers = const <String, String>{},
}) {
  return _runTrackedOperation((openRequest) async {
    _validateGrantEndpoint(grant);
    if (grant.isRefreshTokenExpired()) {
      throw ArgumentError(
        'grant.refreshToken is expired and cannot be refreshed.',
      );
    }
    final token = grant.refreshToken;
    if (token == null) {
      throw ArgumentError(
        'grant.refreshToken must contain a usable refresh token.',
      );
    }
    final requestRefreshToken = _nonEmptyToken(token, 'grant.refreshToken');
    final realm = _requiredGrantLineageField(grant.realm, 'grant.realm');
    final authMethod = _requiredGrantLineageField(
      grant.authMethod,
      'grant.authMethod',
    );
    final authId = _requiredGrantLineageField(grant.authId, 'grant.authId');
    final authRole = _requiredGrantLineageField(
      grant.authRole,
      'grant.authRole',
    );
    final tokenType = _nonEmptyArgument(grant.tokenType, 'grant.tokenType');
    if (tokenType.toLowerCase() != 'bearer') {
      throw ArgumentError(
        'grant.tokenType must use the Bearer authentication scheme.',
      );
    }
    final authProvider = grant.authProvider;
    if (authProvider != null) {
      _nonEmptyArgument(authProvider, 'grant.authProvider');
    }

    final refreshed = await _requestRefreshToken(
      requestRefreshToken,
      headers: headers,
      openRequest: openRequest,
    );
    _validateRefreshedGrantLineage(
      refreshed,
      realm: realm,
      authMethod: authMethod,
      authId: authId,
      authRole: authRole,
      authProvider: authProvider,
      details: grant.details,
    );
    return refreshed;
  });
}