Skip to content

Commit ed04242

Browse files
committed
fusionauth support
1 parent 4cfc971 commit ed04242

File tree

13 files changed

+160
-31
lines changed

13 files changed

+160
-31
lines changed

build.gradle

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
plugins {
22
id 'me.champeau.gradle.jmh' version '0.4.8' apply false
3-
id 'com.github.ben-manes.versions' version '0.20.0' apply false
4-
id 'org.owasp.dependencycheck' version '4.0.2' apply false
3+
id 'com.github.ben-manes.versions' version '0.27.0' apply false
4+
id 'org.owasp.dependencycheck' version '5.2.2' apply false
55
id 'com.github.spotbugs' version '1.6.9' apply false
66
id 'io.morethan.jmhreport' version '0.9.0' apply false
77
}
@@ -17,12 +17,13 @@ subprojects {
1717
targetCompatibility = 1.8
1818

1919
ext {
20-
javaJwtVersion = '3.7.0'
21-
jwksRsaVersion = '0.7.0'
20+
javaJwtVersion = '3.8.3'
21+
jwksRsaVersion = '0.9.0'
2222
jjwtVersion = '0.9.1'
2323
jmhVersion = '1.21'
2424
oktaVersion = '0.4.0'
25-
junitJupiterVersion = '5.3.2'
25+
fusionAuthVersion = '3.1.4'
26+
junitJupiterVersion = '5.5.2'
2627
}
2728

2829
repositories {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# fusionauth-jwt-bench
2+
Benchmark configuration for [fusionauth-jwt].
3+
4+
[fusionauth-jwt]: https://github.com/FusionAuth/fusionauth-jwt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
dependencies {
2+
compile project(":jmh-utils")
3+
compile("io.fusionauth:fusionauth-jwt:${fusionAuthVersion}")
4+
}
5+
6+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.github.skjolber.bench.fusionauth;
2+
3+
import java.security.KeyPair;
4+
5+
import com.github.skjolber.bench.utils.JsonWebTokenVerifier;
6+
7+
import io.fusionauth.jwt.InvalidJWTException;
8+
import io.fusionauth.jwt.JWTDecoder;
9+
import io.fusionauth.jwt.Verifier;
10+
import io.fusionauth.jwt.domain.Algorithm;
11+
import io.fusionauth.jwt.domain.JWT;
12+
import io.fusionauth.jwt.rsa.RSAVerifier;
13+
import io.fusionauth.pem.domain.PEM;
14+
15+
public class FusionAuthJsonWebTokenVerifier implements JsonWebTokenVerifier<JWT> {
16+
17+
private final static Verifier nullVerifier = new Verifier() {
18+
19+
@Override
20+
public void verify(Algorithm algorithm, byte[] message, byte[] signature) {
21+
// noop
22+
}
23+
24+
@Override
25+
public boolean canVerify(Algorithm algorithm) {
26+
return true;
27+
}
28+
};
29+
30+
private final RSAVerifier verifier;
31+
private final JWTDecoder decoder;
32+
private final String issuer;
33+
private final String audience;
34+
35+
public FusionAuthJsonWebTokenVerifier(KeyPair keyPair, String issuer, String audience) {
36+
this.issuer = issuer;
37+
this.audience = audience;
38+
39+
String encode = PEM.encode(keyPair.getPublic());
40+
41+
decoder = JWT.getDecoder();
42+
verifier = RSAVerifier.newVerifier(encode);
43+
}
44+
45+
@Override
46+
public JWT verifyJsonWebToken(String token) {
47+
JWT jwt = decoder.decode(token, verifier);
48+
49+
// lets add some claim verification here; the other implementations do this already
50+
if(!issuer.equals(jwt.getString("iss"))) {
51+
throw new InvalidJWTException("Unexpected issuer");
52+
}
53+
54+
if(!audience.equals(jwt.getString("aud"))) {
55+
throw new InvalidJWTException("Unexpected audience");
56+
}
57+
58+
return jwt;
59+
}
60+
61+
public JWT parseToken(String token) throws Exception {
62+
return decoder.decode(token, nullVerifier);
63+
}
64+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.github.skjolber.bench.fusionauth;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import org.junit.jupiter.api.Test;
7+
8+
import com.github.skjolber.bench.fusionauth.FusionAuthJsonWebTokenVerifier;
9+
import com.github.skjolber.bench.utils.JsonWebTokenGenerator;
10+
11+
public class FustionAuthJsonWebTokenVerifierTest {
12+
13+
@Test
14+
public void testVerifier() throws Exception {
15+
JsonWebTokenGenerator generator = new JsonWebTokenGenerator();
16+
17+
Map<String, Object> map = new HashMap<>();
18+
map.put("test", "value");
19+
20+
String issuer = "https://test";
21+
String audience = "https://audience";
22+
23+
String token = generator.createJsonWebToken(map, issuer, audience);
24+
25+
FusionAuthJsonWebTokenVerifier verifier = new FusionAuthJsonWebTokenVerifier(generator.getKeyPair(), issuer, audience);
26+
27+
verifier.verifyJsonWebToken(token);
28+
}
29+
}

frameworks/java-jwt-bench/src/main/java/com/auth0/jwt/Auth0TokenVerifier.java

+6
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,24 @@
1010
public class Auth0TokenVerifier implements JsonWebTokenVerifier<DecodedJWT> {
1111

1212
private final JWTVerifier verifier;
13+
private final JWT jwt;
1314

1415
public Auth0TokenVerifier(KeyPair keyPair, String issuer, String audience) {
1516
verifier = JWT
1617
.require(Algorithm.RSA256(new KeyProvider(keyPair)))
1718
.withIssuer(issuer)
1819
.withAudience(audience)
1920
.build();
21+
jwt = new JWT();
2022
}
2123

2224
@Override
2325
public DecodedJWT verifyJsonWebToken(String token) throws Exception {
2426
return verifier.verify(token);
2527
}
2628

29+
public DecodedJWT parseToken(String token) {
30+
return jwt.decodeJwt(token);
31+
}
32+
2733
}

jmh-benchmark/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ dependencies {
66
jmh project(":frameworks:jjwt-bench")
77
jmh project(":frameworks:java-jwt-bench")
88
jmh project(":frameworks:okta-jwt-verifier-bench")
9+
jmh project(":frameworks:fusionauth-jwt-bench")
910
}
1011

jmh-benchmark/src/jmh/java/com/auth0/jwt/JwtParseBenchmark.java

-22
This file was deleted.

jmh-benchmark/src/jmh/java/com/auth0/jwt/BenchmarkState.java renamed to jmh-benchmark/src/jmh/java/com/github/skjolber/jwt/BenchmarkState.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.auth0.jwt;
1+
package com.github.skjolber.jwt;
22

33
import java.util.HashMap;
44
import java.util.Map;
@@ -8,6 +8,8 @@
88
import org.openjdk.jmh.annotations.Setup;
99
import org.openjdk.jmh.annotations.State;
1010

11+
import com.auth0.jwt.Auth0TokenVerifier;
12+
import com.github.skjolber.bench.fusionauth.FusionAuthJsonWebTokenVerifier;
1113
import com.github.skjolber.bench.jjwt.JavaJsonWebTokenVerifier;
1214
import com.github.skjolber.bench.okta.OktaJsonWebTokenVerifier;
1315
import com.github.skjolber.bench.utils.JsonWebTokenGenerator;
@@ -17,6 +19,7 @@ public class BenchmarkState {
1719

1820
private String token;
1921

22+
private FusionAuthJsonWebTokenVerifier fusionAuthJsonWebTokenVerifier;
2023
private OktaJsonWebTokenVerifier oktaJsonWebTokenVerifier;
2124
private JavaJsonWebTokenVerifier javaJsonWebTokenVerifier;
2225
private Auth0TokenVerifier auth0TokenVerifier;
@@ -34,6 +37,8 @@ public void init() throws Exception {
3437
token = generator.createJsonWebToken(map, issuer, audience);
3538

3639
oktaJsonWebTokenVerifier = new OktaJsonWebTokenVerifier(generator.getKeyPair(), issuer, audience);
40+
41+
fusionAuthJsonWebTokenVerifier = new FusionAuthJsonWebTokenVerifier(generator.getKeyPair(), issuer, audience);
3742
javaJsonWebTokenVerifier = new JavaJsonWebTokenVerifier(generator.getKeyPair(), issuer, audience);
3843
auth0TokenVerifier = new Auth0TokenVerifier(generator.getKeyPair(), issuer, audience);
3944
}
@@ -50,6 +55,10 @@ public OktaJsonWebTokenVerifier getOktaJsonWebTokenVerifier() {
5055
return oktaJsonWebTokenVerifier;
5156
}
5257

58+
public FusionAuthJsonWebTokenVerifier getFusionAuthJsonWebTokenVerifier() {
59+
return fusionAuthJsonWebTokenVerifier;
60+
}
61+
5362
public String getToken() {
5463
return token;
5564
}

jmh-benchmark/src/jmh/java/com/auth0/jwt/JwtClaimBenchmark.java renamed to jmh-benchmark/src/jmh/java/com/github/skjolber/jwt/JwtClaimBenchmark.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.auth0.jwt;
1+
package com.github.skjolber.jwt;
22

33
import org.openjdk.jmh.annotations.Benchmark;
44

@@ -18,4 +18,9 @@ public Object auth0_claim(BenchmarkState state) throws Exception {
1818
public Object okta_claim(BenchmarkState state) throws Exception {
1919
return state.getOktaJsonWebTokenVerifier().verifyJsonWebToken(state.getToken()).getClaims().get("test");
2020
}
21+
22+
@Benchmark
23+
public Object fusionauth_claim(BenchmarkState state) throws Exception {
24+
return state.getFusionAuthJsonWebTokenVerifier().verifyJsonWebToken(state.getToken()).getObject("test");
25+
}
2126
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.github.skjolber.jwt;
2+
3+
import org.openjdk.jmh.annotations.Benchmark;
4+
5+
import com.auth0.jwt.interfaces.DecodedJWT;
6+
7+
import io.fusionauth.jwt.domain.JWT;
8+
9+
public class JwtParseBenchmark {
10+
11+
@Benchmark
12+
public JWT parse(BenchmarkState state) throws Exception {
13+
return state.getFusionAuthJsonWebTokenVerifier().parseToken(state.getToken());
14+
}
15+
16+
@Benchmark
17+
public DecodedJWT auth0_parse(BenchmarkState state) {
18+
return state.getAuth0TokenVerifier().parseToken(state.getToken());
19+
}
20+
21+
}

jmh-benchmark/src/jmh/java/com/auth0/jwt/JwtVerifyBenchmark.java renamed to jmh-benchmark/src/jmh/java/com/github/skjolber/jwt/JwtVerifyBenchmark.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.auth0.jwt;
1+
package com.github.skjolber.jwt;
22

33
import org.openjdk.jmh.annotations.Benchmark;
44

@@ -18,4 +18,9 @@ public Object auth0_verify(BenchmarkState state) throws Exception {
1818
public Object okta_verify(BenchmarkState state) throws Exception {
1919
return state.getOktaJsonWebTokenVerifier().verifyJsonWebToken(state.getToken());
2020
}
21+
22+
@Benchmark
23+
public Object fusionauth_verify(BenchmarkState state) throws Exception {
24+
return state.getFusionAuthJsonWebTokenVerifier().verifyJsonWebToken(state.getToken());
25+
}
2126
}

settings.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
include 'jmh-utils', 'frameworks:java-jwt-bench', 'frameworks:jjwt-bench', 'frameworks:okta-jwt-verifier-bench', 'jmh-benchmark'
1+
include 'jmh-utils', 'frameworks:java-jwt-bench', 'frameworks:jjwt-bench', 'frameworks:okta-jwt-verifier-bench', 'frameworks:fusionauth-jwt-bench', 'jmh-benchmark'

0 commit comments

Comments
 (0)