Skip to content

Commit daf5660

Browse files
committed
Refactor registration and assertion responses handling
1 parent 3e9708c commit daf5660

7 files changed

Lines changed: 49 additions & 22 deletions

File tree

src/main/java/com/helioauth/passkeys/api/service/UserCredentialManager.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.helioauth.passkeys.api.generated.models.SignUpFinishRequest;
2626
import com.helioauth.passkeys.api.generated.models.SignUpFinishResponse;
2727
import com.helioauth.passkeys.api.generated.models.SignUpStartResponse;
28+
import com.helioauth.passkeys.api.mapper.RegistrationResponseMapper;
2829
import com.helioauth.passkeys.api.mapper.UserCredentialMapper;
2930
import com.helioauth.passkeys.api.service.dto.CredentialRegistrationResult;
3031
import com.helioauth.passkeys.api.service.exception.CreateCredentialFailedException;
@@ -48,10 +49,13 @@ public class UserCredentialManager {
4849
private final UserRepository userRepository;
4950
private final UserCredentialRepository userCredentialRepository;
5051
private final UserCredentialMapper userCredentialMapper;
52+
private final RegistrationResponseMapper registrationResponseMapper;
5153

5254
public SignUpStartResponse createCredential(String name) {
5355
try {
54-
return webAuthnAuthenticator.startRegistration(name);
56+
return registrationResponseMapper.toSignUpStartResponse(
57+
webAuthnAuthenticator.startRegistration(name)
58+
);
5559
} catch (JsonProcessingException e) {
5660
log.error("Creating a new credential failed", e);
5761
throw new CreateCredentialFailedException();

src/main/java/com/helioauth/passkeys/api/service/UserSignInService.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@
1818

1919
import com.fasterxml.jackson.core.JsonProcessingException;
2020
import com.helioauth.passkeys.api.domain.UserCredentialRepository;
21+
import com.helioauth.passkeys.api.domain.UserRepository;
2122
import com.helioauth.passkeys.api.generated.models.SignInStartResponse;
23+
import com.helioauth.passkeys.api.mapper.RegistrationResponseMapper;
2224
import com.helioauth.passkeys.api.service.dto.CredentialAssertionResult;
2325
import com.helioauth.passkeys.api.service.exception.SignInFailedException;
2426
import lombok.RequiredArgsConstructor;
2527
import lombok.extern.slf4j.Slf4j;
28+
import org.apache.commons.lang3.StringUtils;
2629
import org.springframework.stereotype.Service;
2730
import org.springframework.transaction.annotation.Transactional;
2831

@@ -37,10 +40,24 @@
3740
public class UserSignInService {
3841
private final UserCredentialRepository userCredentialRepository;
3942

43+
private final UserRepository userRepository;
44+
4045
private final WebAuthnAuthenticator webAuthnAuthenticator;
4146

47+
private final RegistrationResponseMapper registrationResponseMapper;
48+
4249
public SignInStartResponse startAssertion(String name) throws JsonProcessingException {
43-
return webAuthnAuthenticator.startAssertion(name);
50+
if (!StringUtils.isBlank(name) && userRepository.findByName(name).isEmpty()) {
51+
return registrationResponseMapper.toSignInStartResponse(
52+
webAuthnAuthenticator.startRegistration(name),
53+
false
54+
);
55+
}
56+
57+
return registrationResponseMapper.toSignInStartResponse(
58+
webAuthnAuthenticator.startAssertion(name),
59+
true
60+
);
4461
}
4562

4663
@Transactional

src/main/java/com/helioauth/passkeys/api/service/UserSignupService.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.helioauth.passkeys.api.domain.UserRepository;
2424
import com.helioauth.passkeys.api.generated.models.SignUpFinishResponse;
2525
import com.helioauth.passkeys.api.generated.models.SignUpStartResponse;
26+
import com.helioauth.passkeys.api.mapper.RegistrationResponseMapper;
2627
import com.helioauth.passkeys.api.mapper.UserCredentialMapper;
2728
import com.helioauth.passkeys.api.service.dto.CredentialRegistrationResult;
2829
import com.helioauth.passkeys.api.service.exception.SignUpFailedException;
@@ -46,10 +47,13 @@ public class UserSignupService {
4647
private final UserCredentialRepository userCredentialRepository;
4748
private final WebAuthnAuthenticator webAuthnAuthenticator;
4849
private final UserCredentialMapper userCredentialMapper;
50+
private final RegistrationResponseMapper registrationResponseMapper;
4951

5052
public SignUpStartResponse startRegistration(String name) {
5153
try {
52-
return webAuthnAuthenticator.startRegistration(name);
54+
return registrationResponseMapper.toSignUpStartResponse(
55+
webAuthnAuthenticator.startRegistration(name)
56+
);
5357
} catch (JsonProcessingException e) {
5458
log.error("Register Credential failed", e);
5559
throw new SignUpFailedException();

src/main/java/com/helioauth/passkeys/api/service/WebAuthnAuthenticator.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818

1919
import com.fasterxml.jackson.core.JsonProcessingException;
2020
import com.github.benmanes.caffeine.cache.Cache;
21-
import com.helioauth.passkeys.api.generated.models.SignInStartResponse;
22-
import com.helioauth.passkeys.api.generated.models.SignUpStartResponse;
2321
import com.helioauth.passkeys.api.mapper.CredentialRegistrationResultMapper;
22+
import com.helioauth.passkeys.api.mapper.RegistrationResponseMapper;
23+
import com.helioauth.passkeys.api.service.dto.AssertionStartResult;
2424
import com.helioauth.passkeys.api.service.dto.CredentialAssertionResult;
2525
import com.helioauth.passkeys.api.service.dto.CredentialRegistrationResult;
2626
import com.helioauth.passkeys.api.service.exception.CredentialAssertionFailedException;
@@ -70,12 +70,14 @@ public class WebAuthnAuthenticator {
7070

7171
private static final SecureRandom random = new SecureRandom();
7272

73-
public SignUpStartResponse startRegistration(String name) throws JsonProcessingException {
73+
private final RegistrationResponseMapper registrationResponseMapper;
74+
75+
public AssertionStartResult startRegistration(String name) throws JsonProcessingException {
7476
ByteArray id = generateRandom();
7577
return startRegistration(name, id);
7678
}
7779

78-
public SignUpStartResponse startRegistration(String name, ByteArray userId) throws JsonProcessingException {
80+
public AssertionStartResult startRegistration(String name, ByteArray userId) throws JsonProcessingException {
7981
ResidentKeyRequirement residentKeyRequirement = ResidentKeyRequirement.PREFERRED;
8082

8183
PublicKeyCredentialCreationOptions request = relyingParty.startRegistration(StartRegistrationOptions.builder()
@@ -97,10 +99,7 @@ public SignUpStartResponse startRegistration(String name, ByteArray userId) thro
9799
String requestId = generateRandom().getHex();
98100
webAuthnRequestCache.put(requestId, request.toJson());
99101

100-
return new SignUpStartResponse(
101-
requestId,
102-
request.toCredentialsCreateJson()
103-
);
102+
return new AssertionStartResult(requestId, request.toCredentialsCreateJson());
104103
}
105104

106105
public String getUsernameByRequestId(String requestId) throws IOException {
@@ -138,15 +137,15 @@ public CredentialRegistrationResult finishRegistration(String requestId, String
138137
}
139138
}
140139

141-
public SignInStartResponse startAssertion(String name) throws JsonProcessingException {
140+
public AssertionStartResult startAssertion(String name) throws JsonProcessingException {
142141
AssertionRequest request = relyingParty.startAssertion(StartAssertionOptions.builder()
143142
.username(name)
144143
.build());
145144

146145
String requestId = generateRandom().getHex();
147146
webAuthnRequestCache.put(requestId, request.toJson());
148147

149-
return new SignInStartResponse(requestId, request.toCredentialsGetJson());
148+
return new AssertionStartResult(requestId, request.toCredentialsGetJson());
150149
}
151150

152151
public CredentialAssertionResult finishAssertion(String requestId, String publicKeyCredentialJson) throws IOException {

src/test/java/com/helioauth/passkeys/api/service/UserCredentialManagerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.helioauth.passkeys.api.generated.models.SignUpFinishResponse;
2727
import com.helioauth.passkeys.api.generated.models.SignUpStartResponse;
2828
import com.helioauth.passkeys.api.mapper.UserCredentialMapper;
29+
import com.helioauth.passkeys.api.service.dto.AssertionStartResult;
2930
import com.helioauth.passkeys.api.service.dto.CredentialRegistrationResult;
3031
import com.helioauth.passkeys.api.service.exception.CreateCredentialFailedException;
3132
import com.helioauth.passkeys.api.service.exception.SignUpFailedException;
@@ -117,7 +118,7 @@ void getUserCredentials_returnsResult_whenResultNotEmpty() {
117118
void createCredential_returnsResponse_whenSuccessful() throws JsonProcessingException {
118119
// Arrange
119120
String userName = "testUser";
120-
SignUpStartResponse expectedResponse = new SignUpStartResponse("requestId", "{\"key\":\"value\"}");
121+
AssertionStartResult expectedResponse = new AssertionStartResult("requestId", "{\"key\":\"value\"}");
121122
when(authenticator.startRegistration(userName)).thenReturn(expectedResponse);
122123

123124
// Act

src/test/java/com/helioauth/passkeys/api/service/UserSignupServiceTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.helioauth.passkeys.api.generated.models.SignUpFinishResponse;
99
import com.helioauth.passkeys.api.generated.models.SignUpStartResponse;
1010
import com.helioauth.passkeys.api.mapper.UserCredentialMapper;
11+
import com.helioauth.passkeys.api.service.dto.AssertionStartResult;
1112
import com.helioauth.passkeys.api.service.dto.CredentialRegistrationResult;
1213
import com.helioauth.passkeys.api.service.exception.SignUpFailedException;
1314
import com.helioauth.passkeys.api.service.exception.UsernameAlreadyRegisteredException;
@@ -55,7 +56,7 @@ class UserSignupServiceTest {
5556
void testStartRegistration_Success() throws Exception {
5657
// Arrange
5758
String name = "testuser";
58-
SignUpStartResponse mockResponse = new SignUpStartResponse("requestId123", "{\"options\":\"value\"}");
59+
AssertionStartResult mockResponse = new AssertionStartResult("requestId123", "{\"options\":\"value\"}");
5960
when(webAuthnAuthenticator.startRegistration(name)).thenReturn(mockResponse);
6061

6162
// Act

src/test/java/com/helioauth/passkeys/api/service/WebAuthnAuthenticatorTest.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818

1919
import com.fasterxml.jackson.core.JsonProcessingException;
2020
import com.github.benmanes.caffeine.cache.Cache;
21-
import com.helioauth.passkeys.api.generated.models.SignUpStartResponse;
2221
import com.helioauth.passkeys.api.mapper.CredentialRegistrationResultMapper;
22+
import com.helioauth.passkeys.api.service.dto.AssertionStartResult;
2323
import com.helioauth.passkeys.api.service.dto.CredentialRegistrationResult;
2424
import com.helioauth.passkeys.api.service.exception.CredentialRegistrationFailedException;
2525
import com.yubico.webauthn.FinishRegistrationOptions;
@@ -130,14 +130,14 @@ public void testStartRegistrationWithNameAndUserId() throws JsonProcessingExcept
130130
when(relyingParty.startRegistration(any(StartRegistrationOptions.class))).thenReturn(pkcco);
131131

132132
// Execute the test
133-
SignUpStartResponse response = authenticator.startRegistration(TEST_USER_NAME, TEST_USER_ID);
133+
AssertionStartResult response = authenticator.startRegistration(TEST_USER_NAME, TEST_USER_ID);
134134

135135
// Verify interactions and assert results
136136
verify(relyingParty, times(1)).startRegistration(any(StartRegistrationOptions.class));
137137
verify(webAuthnRequestCache, times(1)).put(anyString(), anyString());
138138
assertNotNull(response);
139-
assertNotNull(response.getRequestId());
140-
assertNotNull(response.getOptions());
139+
assertNotNull(response.requestId());
140+
assertNotNull(response.options());
141141
}
142142

143143
@Test
@@ -154,14 +154,15 @@ public void testStartRegistrationWithName() throws JsonProcessingException, HexE
154154
when(relyingParty.startRegistration(any(StartRegistrationOptions.class))).thenReturn(pkcco);
155155

156156
// Execute the test
157-
SignUpStartResponse response = authenticator.startRegistration(TEST_USER_NAME);
157+
// SignUpStartResponse response = authenticator.startRegistration(TEST_USER_NAME);
158+
AssertionStartResult response = authenticator.startRegistration(TEST_USER_NAME);
158159

159160
// Verify interactions and assert results
160161
verify(relyingParty, times(1)).startRegistration(any(StartRegistrationOptions.class));
161162
verify(webAuthnRequestCache, times(1)).put(anyString(), anyString());
162163
assertNotNull(response);
163-
assertNotNull(response.getRequestId());
164-
assertNotNull(response.getOptions());
164+
assertNotNull(response.requestId());
165+
assertNotNull(response.options());
165166
}
166167

167168
@Test

0 commit comments

Comments
 (0)