From 42b73722c42faf21ac681b2f35fa3c03ce9c23ba Mon Sep 17 00:00:00 2001 From: Wyatt Mufson Date: Tue, 27 Aug 2024 08:45:42 +0900 Subject: [PATCH] Fix some mappings in index.ts, some obj-c updates --- src/index.ts | 12 ++++++++++++ src/lib/passkey.mm | 25 +++++++++++++++---------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/index.ts b/src/index.ts index e8458fb..f34f00c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -62,6 +62,18 @@ class Passkey { } (options.publicKey as PublicKeyCredentialRequestOptions).rpId = this.domain; + options.publicKey.challenge = arrayBufferToBase64( + options.publicKey.challenge as ArrayBuffer, + ); + + (options.publicKey as PublicKeyCredentialRequestOptions).allowCredentials = + ( + options.publicKey as PublicKeyCredentialRequestOptions + ).allowCredentials?.filter((cred) => { + return ( + cred && cred.id && typeof cred.id === 'string' && cred.id.length > 0 + ); + }); return this.handler.HandlePasskeyGet(JSON.stringify(options)); } diff --git a/src/lib/passkey.mm b/src/lib/passkey.mm index b04b48a..effcae5 100644 --- a/src/lib/passkey.mm +++ b/src/lib/passkey.mm @@ -5,10 +5,6 @@ typedef void (^PasskeyCompletionHandler)(NSString *resultMessage, NSString *errorMessage); -NSData* ConvertBufferToNSData(Napi::Buffer buffer) { - return [NSData dataWithBytes:buffer.Data() length:buffer.Length()]; -} - @interface PasskeyHandlerObjC : NSObject @property (nonatomic, strong) PasskeyCompletionHandler completionHandler; @@ -28,7 +24,7 @@ - (instancetype)init { - (void)PerformCreateRequest:(NSDictionary *)options withCompletionHandler:(PasskeyCompletionHandler)completionHandler { self.completionHandler = completionHandler; - if (@available(macOS 12.0, *)) { + if (@available(macOS 13.5, *)) { NSDictionary *publicKeyOptions = options[@"publicKey"]; NSString *rpId = publicKeyOptions[@"rp"][@"id"]; NSString *userName = publicKeyOptions[@"user"][@"name"]; @@ -63,6 +59,10 @@ - (void)PerformCreateRequest:(NSDictionary *)options withCompletionHandler:(Pass request.userVerificationPreference = ASAuthorizationPublicKeyCredentialUserVerificationPreferenceDiscouraged; } } + // NSString *attestationPreference = publicKeyOptions[@"attestation"]; + // if (attestationPreference) { + // request.attestationPreference = attestationPreference; + // } ASAuthorizationController *controller = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]]; @@ -84,10 +84,11 @@ - (void)PerformCreateRequest:(NSDictionary *)options withCompletionHandler:(Pass - (void)PerformGetRequest:(NSDictionary *)options withCompletionHandler:(PasskeyCompletionHandler)completionHandler { self.completionHandler = completionHandler; - if (@available(macOS 12.0, *)) { + if (@available(macOS 13.5, *)) { NSDictionary *publicKeyOptions = options[@"publicKey"]; NSString *rpId = publicKeyOptions[@"rpId"]; - NSData *challenge = publicKeyOptions[@"challenge"]; + NSString *challengeString = publicKeyOptions[@"challenge"]; + NSData *challenge = [[NSData alloc] initWithBase64EncodedString:challengeString options:0]; ASAuthorizationPlatformPublicKeyCredentialProvider *provider = [[ASAuthorizationPlatformPublicKeyCredentialProvider alloc] initWithRelyingPartyIdentifier:rpId]; @@ -143,7 +144,8 @@ - (void)authorizationController:(ASAuthorizationController *)controller didCompl NSData *clientDataJSON = credential.rawClientDataJSON; NSData *attestationObject = credential.rawAttestationObject; NSString *credentialId = [credential.credentialID base64EncodedStringWithOptions:0]; - + ASAuthorizationPublicKeyCredentialAttachment attachment = credential.attachment; + NSDictionary *responseDict = @{ @"clientDataJSON": [clientDataJSON base64EncodedStringWithOptions:0], @"attestationObject": [attestationObject base64EncodedStringWithOptions:0] @@ -156,7 +158,8 @@ - (void)authorizationController:(ASAuthorizationController *)controller didCompl @"rawId": credentialId, // rawId is the raw NSData representing the credential ID @"response": responseDict, // The response object @"clientExtensionResults": @{}, // An empty dictionary, as no extensions are used in this example - @"transports": @[] // Transports are not directly available in ASAuthorizationPlatformPublicKeyCredentialRegistration + @"transports": @[], // Transports are not directly available in ASAuthorizationPlatformPublicKeyCredentialRegistration + @"authenticatorAttachment": attachment == ASAuthorizationPublicKeyCredentialAttachmentPlatform ? @'platform' : @'cross-platform', }; if (![NSJSONSerialization isValidJSONObject:publicKeyCredentialDict]) { @@ -185,6 +188,7 @@ - (void)authorizationController:(ASAuthorizationController *)controller didCompl ASAuthorizationPlatformPublicKeyCredentialAssertion *credential = (ASAuthorizationPlatformPublicKeyCredentialAssertion *)authorization.credential; NSString *credentialId = [credential.credentialID base64EncodedStringWithOptions:0]; + ASAuthorizationPublicKeyCredentialAttachment attachment = credential.attachment; // Create the "response" dictionary, simulating the AuthenticatorAssertionResponse NSDictionary *responseDict = @{ @@ -201,7 +205,8 @@ - (void)authorizationController:(ASAuthorizationController *)controller didCompl @"rawId": credentialId, // rawId is the base64-encoded credential ID @"response": responseDict, // The response object @"clientExtensionResults": @{}, // An empty dictionary, as no extensions are used in this example - @"transports": @[] // Transports are not directly available in ASAuthorizationPlatformPublicKeyCredentialAssertion + @"transports": @[], // Transports are not directly available in ASAuthorizationPlatformPublicKeyCredentialAssertion + @"authenticatorAttachment": attachment == ASAuthorizationPublicKeyCredentialAttachmentPlatform ? @'platform' : @'cross-platform', }; if (![NSJSONSerialization isValidJSONObject:publicKeyCredentialDict]) {