Skip to content

Commit f7f54ea

Browse files
authored
Merge pull request #4 from elukewalker/scion/java-webauthn-v2
v0.0.2.0 fix: code review fixes and dependency cleanup for java-webauthn-server 2.x migration
2 parents 3b419be + 45beafd commit f7f54ea

13 files changed

Lines changed: 65 additions & 83 deletions

File tree

2_Credential_Repository/README.md

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Windows 10 example of multiple credentials on a security key. The top choice is
5050

5151

5252
### Dependency configuration
53-
Open the ```pom.xml``` and add the webauthn-server-core and webauthn-server-attestation dependencies. The workshop is known to work with version 2.9.0 of the java-webauthn-server.
53+
Open the ```pom.xml``` and add the webauthn-server-core dependency and supporting libraries. The workshop is known to work with version 2.9.0 of the java-webauthn-server.
5454
```xml
5555
<dependency>
5656
<groupId>ch.qos.logback</groupId>
@@ -64,13 +64,6 @@ Open the ```pom.xml``` and add the webauthn-server-core and webauthn-server-atte
6464
<version>2.9.0</version>
6565
<scope>compile</scope>
6666
</dependency>
67-
<dependency>
68-
<groupId>com.yubico</groupId>
69-
<artifactId>webauthn-server-attestation</artifactId>
70-
<!--Check for the latest version at Maven Central-->
71-
<version>2.9.0</version>
72-
<scope>compile</scope>
73-
</dependency>
7467
<dependency>
7568
<groupId>org.bouncycastle</groupId>
7669
<artifactId>bcprov-jdk15on</artifactId>

2_Credential_Repository/complete/pom.xml

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<description>Demo project for Spring Boot</description>
1616

1717
<properties>
18-
<java.version>1.8</java.version>
18+
<java.version>17</java.version>
1919
<maven.compiler.release>17</maven.compiler.release>
2020
</properties>
2121

@@ -66,13 +66,6 @@
6666
<version>2.9.0</version>
6767
<scope>compile</scope>
6868
</dependency>
69-
<dependency>
70-
<groupId>com.yubico</groupId>
71-
<artifactId>webauthn-server-attestation</artifactId>
72-
<!--Check for the latest version at Maven Central-->
73-
<version>2.9.0</version>
74-
<scope>compile</scope>
75-
</dependency>
7669
<!-- BouncyCastle for EdDSA support on Java 8 -->
7770
<dependency>
7871
<groupId>org.bouncycastle</groupId>
@@ -83,7 +76,7 @@
8376
<dependency>
8477
<groupId>com.google.guava</groupId>
8578
<artifactId>guava</artifactId>
86-
<version>31.1-jre</version>
79+
<version>32.1.3-jre</version>
8780
</dependency>
8881
</dependencies>
8982

@@ -147,7 +140,7 @@
147140
<region>${REGION}</region> <!--e.g. centralus -->
148141

149142
<!-- Java Runtime Stack for Web App on Linux-->
150-
<linuxRuntime>jre8</linuxRuntime>
143+
<linuxRuntime>java17-java17</linuxRuntime>
151144
</configuration>
152145
</plugin>
153146
<plugin>

2_Credential_Repository/complete/src/main/java/com/example/demo/WebAuthnServer.java

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,16 @@
2424

2525
package com.example.demo;
2626

27+
import com.example.demo.data.AssertionRequestWrapper;
28+
import com.example.demo.data.AssertionResponse;
29+
import com.example.demo.data.CredentialRegistration;
30+
import com.example.demo.data.RegistrationRequest;
31+
import com.example.demo.data.RegistrationResponse;
32+
import com.example.demo.data.U2fRegistrationResponse;
33+
import com.example.demo.data.U2fRegistrationResult;
2734
import com.fasterxml.jackson.databind.JsonNode;
2835
import com.fasterxml.jackson.databind.ObjectMapper;
36+
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
2937
import com.google.common.cache.Cache;
3038
import com.google.common.cache.CacheBuilder;
3139
import com.yubico.util.Either;
@@ -38,8 +46,6 @@
3846
import com.yubico.webauthn.StartAssertionOptions;
3947
import com.yubico.webauthn.StartRegistrationOptions;
4048
import com.yubico.webauthn.U2fVerifier;
41-
// Attestation framework overhauled in v2.x - old imports removed
42-
// RelyingParty now handles attestation validation internally
4349
import com.yubico.webauthn.data.AttestationConveyancePreference;
4450
import com.yubico.webauthn.data.AuthenticatorSelectionCriteria;
4551
import com.yubico.webauthn.data.ByteArray;
@@ -51,17 +57,9 @@
5157
import com.yubico.webauthn.exception.RegistrationFailedException;
5258
import com.yubico.webauthn.extension.appid.AppId;
5359
import com.yubico.webauthn.extension.appid.InvalidAppIdException;
54-
import com.example.demo.data.AssertionRequestWrapper;
55-
import com.example.demo.data.AssertionResponse;
56-
import com.example.demo.data.CredentialRegistration;
57-
import com.example.demo.data.RegistrationRequest;
58-
import com.example.demo.data.RegistrationResponse;
59-
import com.example.demo.data.U2fRegistrationResponse;
60-
import com.example.demo.data.U2fRegistrationResult;
60+
import java.io.ByteArrayInputStream;
6161
import java.io.IOException;
62-
import java.io.InputStream;
6362
import java.security.SecureRandom;
64-
import java.security.cert.CertificateEncodingException;
6563
import java.security.cert.CertificateException;
6664
import java.security.cert.CertificateFactory;
6765
import java.security.cert.X509Certificate;
@@ -93,12 +91,8 @@ public class WebAuthnServer {
9391
private final RegistrationStorage userStorage;
9492
private final Cache<AssertionRequestWrapper, AuthenticatedAction> authenticatedActions = newCache();
9593

96-
// Attestation framework overhauled in v2.x
97-
// Old MetadataService and TrustResolver setup removed
98-
// RelyingParty now handles attestation validation internally via AttestationTrustSource
99-
10094
private final Clock clock = Clock.systemDefaultZone();
101-
private final ObjectMapper jsonMapper = new ObjectMapper();
95+
private final ObjectMapper jsonMapper;
10296

10397
private final RelyingParty rp;
10498

@@ -111,14 +105,14 @@ public WebAuthnServer(RegistrationStorage userStorage, Cache<ByteArray, Registra
111105
this.registerRequestStorage = registerRequestStorage;
112106
this.assertRequestStorage = assertRequestStorage;
113107

108+
this.jsonMapper = new ObjectMapper();
109+
this.jsonMapper.registerModule(new Jdk8Module());
110+
114111
rp = RelyingParty.builder()
115112
.identity(rpIdentity)
116113
.credentialRepository(this.userStorage)
117114
.origins(origins)
118115
.attestationConveyancePreference(Optional.of(AttestationConveyancePreference.DIRECT))
119-
// metadataService replaced with attestationTrustSource in v2.x
120-
// For workshop purposes, using default (no custom trust roots)
121-
// allowUnrequestedExtensions removed in v2.x - now always enabled
122116
.allowUntrustedAttestation(true)
123117
.validateSignatureCounter(true)
124118
.appId(appId)
@@ -131,10 +125,6 @@ private static ByteArray generateRandom(int length) {
131125
return new ByteArray(bytes);
132126
}
133127

134-
// Attestation metadata methods removed in v2.x migration
135-
// Custom attestation trust sources can be configured via RelyingParty.builder().attestationTrustSource()
136-
// For workshop purposes, using default trust configuration
137-
138128
private static <K, V> Cache<K, V> newCache() {
139129
return CacheBuilder.newBuilder()
140130
.maximumSize(100)
@@ -268,7 +258,7 @@ public AttestationCertInfo(ByteArray certDer) {
268258
X509Certificate cert = null;
269259
try {
270260
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
271-
cert = (X509Certificate) certFactory.generateCertificate(new java.io.ByteArrayInputStream(certDer.getBytes()));
261+
cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(certDer.getBytes()));
272262
} catch (CertificateException e) {
273263
logger.error("Failed to parse attestation certificate");
274264
}

2_Credential_Repository/complete/src/main/java/com/example/demo/data/CredentialRegistration.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import com.fasterxml.jackson.annotation.JsonIgnore;
2828
import com.fasterxml.jackson.annotation.JsonProperty;
2929
import com.yubico.webauthn.RegisteredCredential;
30-
// Attestation import removed in v2.x - attestation validation now internal to RelyingParty
3130
import com.yubico.webauthn.data.UserIdentity;
3231
import java.time.Instant;
3332
import java.util.Optional;
@@ -49,9 +48,6 @@ public class CredentialRegistration {
4948
Instant registrationTime;
5049
RegisteredCredential credential;
5150

52-
// attestationMetadata field removed in v2.x migration
53-
// Attestation trust status available via RegistrationResult.isAttestationTrusted()
54-
5551
@JsonProperty("registrationTime")
5652
public String getRegistrationTimestamp() {
5753
return registrationTime.toString();

2_Credential_Repository/complete/src/main/java/com/example/demo/data/U2fRegistrationResult.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.example.demo.data;
22

3-
// Attestation import removed in v2.x - attestation validation now internal to RelyingParty
43
import com.yubico.webauthn.data.ByteArray;
54
import com.yubico.webauthn.data.PublicKeyCredentialDescriptor;
65
import lombok.Builder;
@@ -19,6 +18,4 @@ public class U2fRegistrationResult {
1918
@NonNull
2019
ByteArray publicKeyCose;
2120

22-
// warnings field removed in v2.x - warnings now logged via SLF4J
23-
// attestationMetadata field removed in v2.x migration
2421
}

2_Credential_Repository/complete/src/main/java/com/yubico/webauthn/U2fVerifier.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,17 @@
2424

2525
package com.yubico.webauthn;
2626

27+
import com.example.demo.data.RegistrationRequest;
28+
import com.example.demo.data.U2fRegistrationResponse;
2729
import com.fasterxml.jackson.databind.JsonNode;
2830
import com.fasterxml.jackson.databind.ObjectMapper;
2931
import com.yubico.webauthn.data.ByteArray;
3032
import com.yubico.webauthn.data.exception.Base64UrlException;
3133
import com.yubico.webauthn.extension.appid.AppId;
32-
import com.example.demo.data.RegistrationRequest;
33-
import com.example.demo.data.U2fRegistrationResponse;
3434
import java.io.ByteArrayInputStream;
3535
import java.io.IOException;
3636
import java.io.InputStream;
37+
import java.nio.charset.StandardCharsets;
3738
import java.security.MessageDigest;
3839
import java.security.NoSuchAlgorithmException;
3940
import java.security.cert.CertificateException;
@@ -47,7 +48,7 @@ public class U2fVerifier {
4748
private static ByteArray sha256(String data) {
4849
try {
4950
MessageDigest digest = MessageDigest.getInstance("SHA-256");
50-
return new ByteArray(digest.digest(data.getBytes(java.nio.charset.StandardCharsets.UTF_8)));
51+
return new ByteArray(digest.digest(data.getBytes(StandardCharsets.UTF_8)));
5152
} catch (NoSuchAlgorithmException e) {
5253
throw new RuntimeException("SHA-256 algorithm not available", e);
5354
}

3_Registration/complete/pom.xml

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<description>Demo project for Spring Boot</description>
1616

1717
<properties>
18-
<java.version>1.8</java.version>
18+
<java.version>17</java.version>
1919
<maven.compiler.release>17</maven.compiler.release>
2020
</properties>
2121

@@ -61,13 +61,6 @@
6161
<version>2.9.0</version>
6262
<scope>compile</scope>
6363
</dependency>
64-
<dependency>
65-
<groupId>com.yubico</groupId>
66-
<artifactId>webauthn-server-attestation</artifactId>
67-
<!--Check for the latest version at Maven Central-->
68-
<version>2.9.0</version>
69-
<scope>compile</scope>
70-
</dependency>
7164
<!-- BouncyCastle for EdDSA support on Java 8 -->
7265
<dependency>
7366
<groupId>org.bouncycastle</groupId>
@@ -78,7 +71,7 @@
7871
<dependency>
7972
<groupId>com.google.guava</groupId>
8073
<artifactId>guava</artifactId>
81-
<version>31.1-jre</version>
74+
<version>32.1.3-jre</version>
8275
</dependency>
8376
</dependencies>
8477

@@ -142,7 +135,7 @@
142135
<region>${REGION}</region> <!--e.g. centralus -->
143136

144137
<!-- Java Runtime Stack for Web App on Linux-->
145-
<linuxRuntime>jre8</linuxRuntime>
138+
<linuxRuntime>java17-java17</linuxRuntime>
146139
</configuration>
147140
</plugin>
148141
<plugin>

3_Registration/complete/src/main/java/com/example/demo/WebAuthnServer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import com.example.demo.data.U2fRegistrationResponse;
6060
import com.example.demo.data.U2fRegistrationResult;
6161
import java.io.IOException;
62+
import java.io.ByteArrayInputStream;
6263
import java.io.InputStream;
6364
import java.security.SecureRandom;
6465
import java.security.cert.CertificateEncodingException;
@@ -108,7 +109,7 @@ public class WebAuthnServer {
108109
// RelyingParty now handles attestation validation internally via AttestationTrustSource
109110

110111
private final Clock clock = Clock.systemDefaultZone();
111-
private final ObjectMapper jsonMapper = new ObjectMapper();
112+
private final ObjectMapper jsonMapper;
112113

113114
private final RelyingParty rp;
114115

@@ -121,6 +122,9 @@ public WebAuthnServer(RegistrationStorage userStorage, Cache<ByteArray, Registra
121122
this.registerRequestStorage = registerRequestStorage;
122123
this.assertRequestStorage = assertRequestStorage;
123124

125+
this.jsonMapper = new ObjectMapper();
126+
this.jsonMapper.registerModule(new Jdk8Module());
127+
124128
rp = RelyingParty.builder()
125129
.identity(rpIdentity)
126130
.credentialRepository(this.userStorage)

4_Authentication/complete/pom.xml

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<description>Demo project for Spring Boot</description>
1616

1717
<properties>
18-
<java.version>1.8</java.version>
18+
<java.version>17</java.version>
1919
<maven.compiler.release>17</maven.compiler.release>
2020
</properties>
2121

@@ -66,13 +66,6 @@
6666
<version>2.9.0</version>
6767
<scope>compile</scope>
6868
</dependency>
69-
<dependency>
70-
<groupId>com.yubico</groupId>
71-
<artifactId>webauthn-server-attestation</artifactId>
72-
<!--Check for the latest version at Maven Central-->
73-
<version>2.9.0</version>
74-
<scope>compile</scope>
75-
</dependency>
7669
<!-- BouncyCastle for EdDSA support on Java 8 -->
7770
<dependency>
7871
<groupId>org.bouncycastle</groupId>
@@ -83,7 +76,7 @@
8376
<dependency>
8477
<groupId>com.google.guava</groupId>
8578
<artifactId>guava</artifactId>
86-
<version>31.1-jre</version>
79+
<version>32.1.3-jre</version>
8780
</dependency>
8881
</dependencies>
8982

@@ -147,7 +140,7 @@
147140
<region>${REGION}</region> <!--e.g. centralus -->
148141

149142
<!-- Java Runtime Stack for Web App on Linux-->
150-
<linuxRuntime>jre8</linuxRuntime>
143+
<linuxRuntime>java17-java17</linuxRuntime>
151144
</configuration>
152145
</plugin>
153146
<plugin>

4_Authentication/complete/src/main/java/com/example/demo/WebAuthnServer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import com.example.demo.data.U2fRegistrationResponse;
6060
import com.example.demo.data.U2fRegistrationResult;
6161
import java.io.IOException;
62+
import java.io.ByteArrayInputStream;
6263
import java.io.InputStream;
6364
import java.security.SecureRandom;
6465
import java.security.cert.CertificateEncodingException;
@@ -108,7 +109,7 @@ public class WebAuthnServer {
108109
// RelyingParty now handles attestation validation internally via AttestationTrustSource
109110

110111
private final Clock clock = Clock.systemDefaultZone();
111-
private final ObjectMapper jsonMapper = new ObjectMapper();
112+
private final ObjectMapper jsonMapper;
112113

113114
private final RelyingParty rp;
114115

@@ -121,6 +122,9 @@ public WebAuthnServer(RegistrationStorage userStorage, Cache<ByteArray, Registra
121122
this.registerRequestStorage = registerRequestStorage;
122123
this.assertRequestStorage = assertRequestStorage;
123124

125+
this.jsonMapper = new ObjectMapper();
126+
this.jsonMapper.registerModule(new Jdk8Module());
127+
124128
rp = RelyingParty.builder()
125129
.identity(rpIdentity)
126130
.credentialRepository(this.userStorage)

0 commit comments

Comments
 (0)