rotateRefreshToken method

Future<TokenPair> rotateRefreshToken(
  1. Session session, {
  2. required String refreshToken,
  3. Transaction? transaction,
})

Returns a new refresh / access token pair.

This invalidates the previous refresh token. Previously created access tokens for this refresh token will continue to work until they expire.

Implementation

Future<TokenPair> rotateRefreshToken(
  final Session session, {
  required final String refreshToken,
  final Transaction? transaction,
}) async {
  final RefreshTokenStringData refreshTokenData;

  try {
    refreshTokenData = RefreshTokenString.parseRefreshTokenString(
      refreshToken,
    );
  } catch (e, stackTrace) {
    session.log(
      'Received malformed refresh token',
      exception: e,
      stackTrace: stackTrace,
      level: LogLevel.debug,
    );

    throw RefreshTokenMalformedServerException();
  }

  if (transaction != null) {
    return _rotateLockedRefreshToken(session, refreshTokenData, transaction);
  }

  // The reuse-revocation delete must survive the rotation failure, so
  // failures are returned from the transaction (committing the delete) and
  // thrown afterwards.
  final Object outcome = await session.db.transaction((final tx) async {
    try {
      return await _rotateLockedRefreshToken(session, refreshTokenData, tx);
    } on RefreshTokenServerException catch (e) {
      return e;
    }
  });
  if (outcome is TokenPair) return outcome;
  throw outcome as RefreshTokenServerException;
}