redeemOtp method

Future<DVAuthTokenResult> redeemOtp(
  1. String identifier,
  2. String code
)

Redeems a passcode for identifier.

Implementation

Future<DVAuthTokenResult> redeemOtp(String identifier, String code) async {
  final lookup = _lookupForOtp(identifier);
  final record = await store.get(lookup);
  if (record == null) {
    return const DVAuthTokenResult.failed(DVAuthTokenFailure.invalid);
  }
  if (record.attempts >= maxAttempts) {
    return const DVAuthTokenResult.failed(DVAuthTokenFailure.throttled);
  }
  if (DateTime.now().isAfter(record.expiresAt)) {
    await store.delete(lookup);
    return const DVAuthTokenResult.failed(DVAuthTokenFailure.invalid);
  }
  if (!_matches(record.hash, code)) {
    // Count the attempt rather than deleting: deleting on the first wrong
    // digit would let anyone cancel someone else's sign-in.
    await store.update(lookup, record.withAttempt());
    return const DVAuthTokenResult.failed(DVAuthTokenFailure.invalid);
  }
  await store.delete(lookup);
  return DVAuthTokenResult.success(record.identifier);
}