createCredential method

  1. @override
Future<AttestationPublicKeyCredential> createCredential(
  1. RegisterInitResponse registerData,
  2. String login,
  3. String name
)
override

Implementation

@override
Future<AttestationPublicKeyCredential> createCredential(RegisterInitResponse registerData, String login, String name) async {

  var authenticatorSelection = web.AuthenticatorSelectionCriteria(
    residentKey: registerData.registrationData.residentKey.name.toLowerCase(),
    requireResidentKey: registerData.registrationData.residentKey == ResidentKeyRequirement.Required,
    userVerification: registerData.registrationData.userVerification.name.toLowerCase()
  );
  if (registerData.registrationData.authenticatorAttachment == AuthenticatorAttachment.Platform) {
    authenticatorSelection.authenticatorAttachment = "platform";
  }
  if (registerData.registrationData.authenticatorAttachment == AuthenticatorAttachment.CrossPlatform) {
    authenticatorSelection.authenticatorAttachment = "cross-platform";
  }

  var options = web.PublicKeyCredentialCreationOptions(
    challenge: Uint8List.fromList(registerData.registrationData.challenge).toJS,
    pubKeyCredParams: (registerData.registrationData.publicKeyCredentialParams.map((element) => web.PublicKeyCredentialParameters(type: element.type, alg: element.alg)).toList()).toJS,
    rp: web.PublicKeyCredentialRpEntity(name: registerData.domain),
    user: web.PublicKeyCredentialUserEntity(
      name: login,
      displayName: name,
      id: Uint8List.fromList(registerData.user.id).toJS
    ),
    attestation: registerData.registrationData.attestationConveyancePreference.name.toLowerCase(),
    authenticatorSelection: authenticatorSelection
  );

  final publicKeyCredential = await (web.window.navigator.credentials.create(web.CredentialCreationOptions(publicKey: options))).toDart as web.PublicKeyCredential;
  final authenticatorResponse = publicKeyCredential.response as web.AuthenticatorAttestationResponse;
  final transports = (authenticatorResponse.getTransports().toDart).map((element) => element.toDart).toList();

  return AttestationPublicKeyCredential(
    publicKeyCredential.id,
    publicKeyCredential.rawId.toDart.asUint8List(),
    publicKeyCredential.type,
    AuthenticatorAttestationResponse(
      authenticatorResponse.attestationObject.toDart.asUint8List(),
      authenticatorResponse.clientDataJSON.toDart.asUint8List(),
      transports
    )
  );
}