validate method

Future<bool> validate(
  1. Challenge challenge, {
  2. int maxAttempts = 15,
})

Triggers the validation for the given challenge

RFC: https://datatracker.ietf.org/doc/html/rfc8555#section-7.5.1

Implementation

Future<bool> validate(Challenge challenge, {int maxAttempts = 15}) async {
  var jws = await _createJWS(challenge.url!, useKid: true, payload: {
    'keyAuthorization':
        '${challenge.token!}.${AcmeUtils.getDigest(JsonWebKey.fromPem(publicKeyPem))}'
  });
  var body = json.encode(jws.toJson());
  var headers = {'Content-Type': 'application/jose+json'};
  try {
    var response = await Dio().post(
      challenge.url!,
      data: body,
      options: Options(headers: headers),
    );
    nonce = response.headers.map[HEADER_REPLAY_NONCE]!.first;
  } on DioException catch (e) {
    print(e.response!.data!.toString());
  }

  do {
    var jws = await _createJWS(challenge.authorizationUrl!, useKid: true);
    var body = json.encode(jws.toJson());

    try {
      var response = await Dio().post(
        challenge.authorizationUrl!,
        data: body,
        options: Options(headers: headers),
      );
      nonce = response.headers.map[HEADER_REPLAY_NONCE]!.first;
      var auth = Authorization.fromJson(response.data);
      if (auth.status == 'valid') {
        return true;
      }
    } on DioException catch (e) {
      print(e.response!.data!.toString());
    }
    maxAttempts--;
    await Future.delayed(Duration(seconds: 4));
  } while (maxAttempts > 0);
  return false;
}