verifyChallenge method

Future<String> verifyChallenge(
  1. Session session, {
  2. required UuidValue requestId,
  3. required String verificationCode,
  4. required Transaction transaction,
})

Verifies a verification code against a SecretChallenge.

Throws:

Returns the encoded completion token that can be used to complete the operation.

Implementation

Future<String> verifyChallenge(
  final Session session, {
  required final UuidValue requestId,
  required final String verificationCode,
  required final Transaction transaction,
}) async {
  final config = _verificationConfig;

  if (await config.hasTooManyAttempts(
    session,
    nonce: requestId,
  )) {
    throw ChallengeRateLimitExceededException();
  }

  final request = await config.getRequest(
    session,
    requestId,
    transaction: transaction,
  );
  if (request == null) {
    throw ChallengeRequestNotFoundException();
  }

  if (config.isAlreadyUsed(request)) {
    throw ChallengeAlreadyUsedException();
  }

  final challenge = config.getChallenge(request);

  if (!await _validateVerificationCode(
    verificationCode: verificationCode,
    challenge: challenge,
  )) {
    throw ChallengeInvalidVerificationCodeException();
  }

  if (config.isExpired(request)) {
    await config.onExpired(session, request);
    throw ChallengeExpiredException();
  }

  final completionTokenResult = await _createCompletionToken(
    session,
    requestId: requestId,
    transaction: transaction,
  );

  await config.linkCompletionToken(
    session,
    request,
    completionTokenResult.challenge,
    transaction: transaction,
  );

  return completionTokenResult.encodedToken;
}