Skip to content

Commit f80b1a3

Browse files
committed
fix passkey name caching issue
1 parent b80d3e3 commit f80b1a3

File tree

2 files changed

+123
-2
lines changed

2 files changed

+123
-2
lines changed

FirebaseAuth/Sources/User/FIRUser.m

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,8 @@ - (void)startPasskeyEnrollmentWithName:(nullable NSString *)name
611611
callback:^(FIRStartPasskeyEnrollmentResponse *_Nullable response,
612612
NSError *_Nullable error) {
613613
if (error) {
614+
// reset the passkey name cache.
615+
self.passkeyName = nil;
614616
completion(nil, error);
615617
return;
616618
} else {
@@ -651,9 +653,9 @@ - (void)finalizePasskeyEnrollmentWithPlatformCredential:
651653
[platformCredential.rawClientDataJSON base64EncodedStringWithOptions:0];
652654
NSString *attestationObject =
653655
[platformCredential.rawAttestationObject base64EncodedStringWithOptions:0];
656+
654657
// If passkey name is not provided, we will provide a firebase formatted default name.
655-
656-
if (self.passkeyName != nil || [self.passkeyName isEqual:@""]) {
658+
if (self.passkeyName == nil || [self.passkeyName isEqual:@""]) {
657659
self.passkeyName = @"Unnamed account (Apple)";
658660
}
659661
FIRFinalizePasskeyEnrollmentRequest *request =

FirebaseAuth/Tests/Unit/FIRUserTests.m

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,12 @@
413413
*/
414414
static NSString *const kPasskeyName = @"mockPasskeyName";
415415

416+
417+
/** @var kDefaultPasskeyName
418+
@brief default passkey name.
419+
*/
420+
static NSString *const kDefaultPasskeyName = @"Unnamed account (Apple)";
421+
416422
/** @var kRpId
417423
@brief The fake passkey relying party identifier.
418424
*/
@@ -988,6 +994,118 @@ - (void)testStartPasskeyEnrollmentSuccess {
988994
}
989995
}
990996

997+
/** @fn testStartPasskeyEnrollmentWithNilNameSuccess
998+
@brief Tests the flow of a successful @c startPasskeyEnrollmentWithName:completion: call
999+
*/
1000+
- (void)testStartPasskeyEnrollmentWithNilNameSuccess {
1001+
if (@available(iOS 15.0, tvOS 16.0, macOS 12.0, *)) {
1002+
OCMExpect([_mockBackend startPasskeyEnrollment:[OCMArg any] callback:[OCMArg any]])
1003+
.andCallBlock2(^(FIRStartPasskeyEnrollmentRequest *_Nullable request,
1004+
FIRStartPasskeyEnrollmentResponseCallback callback) {
1005+
XCTAssertEqualObjects(request.APIKey, kAPIKey);
1006+
dispatch_async(FIRAuthGlobalWorkQueue(), ^() {
1007+
id mockStartPasskeyEnrollmentResponse =
1008+
OCMClassMock([FIRStartPasskeyEnrollmentResponse class]);
1009+
OCMStub([mockStartPasskeyEnrollmentResponse rpID]).andReturn(kRpId);
1010+
OCMStub([mockStartPasskeyEnrollmentResponse challenge]).andReturn(kChallenge);
1011+
OCMStub([mockStartPasskeyEnrollmentResponse userID]).andReturn(kUserID);
1012+
callback(mockStartPasskeyEnrollmentResponse, nil);
1013+
});
1014+
});
1015+
XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
1016+
id mockGetAccountInfoResponseUser = OCMClassMock([FIRGetAccountInfoResponseUser class]);
1017+
[self
1018+
signInAnonymouslyWithMockGetAccountInfoResponse:mockGetAccountInfoResponseUser
1019+
completion:^(FIRUser *_Nonnull user) {
1020+
[user
1021+
startPasskeyEnrollmentWithName:nil
1022+
completion:^(
1023+
ASAuthorizationPlatformPublicKeyCredentialRegistrationRequest
1024+
*_Nullable request,
1025+
NSError
1026+
*_Nullable error) {
1027+
XCTAssertNil(error);
1028+
XCTAssertEqualObjects(
1029+
user.passkeyName,
1030+
kDefaultPasskeyName);
1031+
XCTAssertEqualObjects(
1032+
[[request challenge]
1033+
base64EncodedStringWithOptions:
1034+
0],
1035+
kChallenge);
1036+
XCTAssertEqualObjects(
1037+
[request
1038+
relyingPartyIdentifier],
1039+
kRpId);
1040+
XCTAssertEqualObjects(
1041+
[[request userID]
1042+
base64EncodedStringWithOptions:
1043+
0],
1044+
kUserID);
1045+
[expectation fulfill];
1046+
}];
1047+
}];
1048+
[self waitForExpectationsWithTimeout:kExpectationTimeout handler:nil];
1049+
OCMVerifyAll(_mockBackend);
1050+
}
1051+
}
1052+
1053+
/** @fn testStartPasskeyEnrollmentWithEmptyNameSuccess
1054+
@brief Tests the flow of a successful @c startPasskeyEnrollmentWithName:completion: call
1055+
*/
1056+
- (void)testStartPasskeyEnrollmentWithEmptyNameSuccess {
1057+
if (@available(iOS 15.0, tvOS 16.0, macOS 12.0, *)) {
1058+
OCMExpect([_mockBackend startPasskeyEnrollment:[OCMArg any] callback:[OCMArg any]])
1059+
.andCallBlock2(^(FIRStartPasskeyEnrollmentRequest *_Nullable request,
1060+
FIRStartPasskeyEnrollmentResponseCallback callback) {
1061+
XCTAssertEqualObjects(request.APIKey, kAPIKey);
1062+
dispatch_async(FIRAuthGlobalWorkQueue(), ^() {
1063+
id mockStartPasskeyEnrollmentResponse =
1064+
OCMClassMock([FIRStartPasskeyEnrollmentResponse class]);
1065+
OCMStub([mockStartPasskeyEnrollmentResponse rpID]).andReturn(kRpId);
1066+
OCMStub([mockStartPasskeyEnrollmentResponse challenge]).andReturn(kChallenge);
1067+
OCMStub([mockStartPasskeyEnrollmentResponse userID]).andReturn(kUserID);
1068+
callback(mockStartPasskeyEnrollmentResponse, nil);
1069+
});
1070+
});
1071+
XCTestExpectation *expectation = [self expectationWithDescription:@"callback"];
1072+
id mockGetAccountInfoResponseUser = OCMClassMock([FIRGetAccountInfoResponseUser class]);
1073+
[self
1074+
signInAnonymouslyWithMockGetAccountInfoResponse:mockGetAccountInfoResponseUser
1075+
completion:^(FIRUser *_Nonnull user) {
1076+
[user
1077+
startPasskeyEnrollmentWithName:@""
1078+
completion:^(
1079+
ASAuthorizationPlatformPublicKeyCredentialRegistrationRequest
1080+
*_Nullable request,
1081+
NSError
1082+
*_Nullable error) {
1083+
XCTAssertNil(error);
1084+
XCTAssertEqualObjects(
1085+
user.passkeyName,
1086+
kDefaultPasskeyName);
1087+
XCTAssertEqualObjects(
1088+
[[request challenge]
1089+
base64EncodedStringWithOptions:
1090+
0],
1091+
kChallenge);
1092+
XCTAssertEqualObjects(
1093+
[request
1094+
relyingPartyIdentifier],
1095+
kRpId);
1096+
XCTAssertEqualObjects(
1097+
[[request userID]
1098+
base64EncodedStringWithOptions:
1099+
0],
1100+
kUserID);
1101+
[expectation fulfill];
1102+
}];
1103+
}];
1104+
[self waitForExpectationsWithTimeout:kExpectationTimeout handler:nil];
1105+
OCMVerifyAll(_mockBackend);
1106+
}
1107+
}
1108+
9911109
/** @fn testStartPasskeyEnrollmentFailure
9921110
@brief Tests the flow of a failed @c startPasskeyEnrollmentWithName:completion: call
9931111
*/
@@ -1008,6 +1126,7 @@ - (void)testStartPasskeyEnrollmentFailure {
10081126
NSError
10091127
*_Nullable error) {
10101128
XCTAssertNil(request);
1129+
XCTAssertNil(user.passkeyName);
10111130
XCTAssertEqual(
10121131
error.code,
10131132
FIRAuthErrorCodeOperationNotAllowed);

0 commit comments

Comments
 (0)