redeemOtp method
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);
}