Skip to content

Commit 09ea288

Browse files
authored
codes and tests added (#17504)
Signed-off-by: Emmanuel Mireku Omari <[email protected]>
1 parent 1e91176 commit 09ea288

File tree

5 files changed

+259
-0
lines changed

5 files changed

+259
-0
lines changed

security-modules/jwt/pom.xml

+17
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,23 @@
1919
<artifactId>java-jwt</artifactId>
2020
<version>${auth0-jwt.version}</version>
2121
</dependency>
22+
<dependency>
23+
<groupId>io.jsonwebtoken</groupId>
24+
<artifactId>jjwt-api</artifactId>
25+
<version>0.11.5</version>
26+
</dependency>
27+
<dependency>
28+
<groupId>io.jsonwebtoken</groupId>
29+
<artifactId>jjwt-impl</artifactId>
30+
<version>0.11.5</version>
31+
<scope>runtime</scope>
32+
</dependency>
33+
<dependency>
34+
<groupId>io.jsonwebtoken</groupId>
35+
<artifactId>jjwt-jackson</artifactId>
36+
<version>0.11.5</version>
37+
<scope>runtime</scope>
38+
</dependency>
2239
</dependencies>
2340

2441
<properties>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.baeldung.jwt.replace_deprecated_jwt_parser;
2+
3+
import java.util.Date;
4+
5+
import javax.crypto.SecretKey;
6+
7+
import io.jsonwebtoken.Claims;
8+
import io.jsonwebtoken.JwtParser;
9+
import io.jsonwebtoken.Jwts;
10+
import io.jsonwebtoken.SignatureAlgorithm;
11+
import io.jsonwebtoken.security.Keys;
12+
13+
public class DeprecatedParser {
14+
15+
public static void main(String args[]) {
16+
17+
SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
18+
19+
String token = Jwts.builder()
20+
.setSubject("baeldung")
21+
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))
22+
.signWith(key)
23+
.compact();
24+
25+
JwtParser parser = Jwts.parser()
26+
.setSigningKey(key);
27+
28+
Claims claims = parser.parseClaimsJws(token)
29+
.getBody();
30+
31+
System.out.println("Claims: " + claims);
32+
}
33+
34+
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.baeldung.jwt.replace_deprecated_jwt_parser;
2+
3+
import java.util.Date;
4+
5+
import javax.crypto.SecretKey;
6+
7+
import io.jsonwebtoken.Claims;
8+
import io.jsonwebtoken.JwtParser;
9+
import io.jsonwebtoken.Jwts;
10+
import io.jsonwebtoken.SignatureAlgorithm;
11+
import io.jsonwebtoken.security.Keys;
12+
13+
public class JwtParserBuilder {
14+
15+
public static void main(String[] args) {
16+
SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
17+
18+
String token = Jwts.builder()
19+
.setSubject("username")
20+
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))
21+
.signWith(key)
22+
.compact();
23+
24+
JwtParser parser = Jwts.parserBuilder()
25+
.setSigningKey(key)
26+
.build();
27+
28+
Claims claims = parser.parseClaimsJws(token)
29+
.getBody();
30+
31+
System.out.println("Claims: " + claims);
32+
}
33+
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.baeldung.jwt.replace_deprecated_jwt_parser;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.util.Date;
6+
7+
import javax.crypto.SecretKey;
8+
9+
import org.junit.jupiter.api.Assertions;
10+
import org.junit.jupiter.api.BeforeEach;
11+
import org.junit.jupiter.api.Test;
12+
13+
import io.jsonwebtoken.Claims;
14+
import io.jsonwebtoken.Jws;
15+
import io.jsonwebtoken.JwtParser;
16+
import io.jsonwebtoken.Jwts;
17+
import io.jsonwebtoken.SignatureAlgorithm;
18+
import io.jsonwebtoken.security.Keys;
19+
20+
class DeprecatedParserUnitTest {
21+
22+
private SecretKey key;
23+
private String token;
24+
25+
@BeforeEach
26+
public void setup() {
27+
key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
28+
token = Jwts.builder()
29+
.setSubject("baeldung")
30+
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))
31+
.signWith(key)
32+
.compact();
33+
}
34+
35+
@Test
36+
void givenDeprecatedParser_whenParsingTokenInMultipleThreads_thenMayNotBeThreadSafe() {
37+
38+
JwtParser parser = Jwts.parser()
39+
.setSigningKey(key);
40+
41+
Runnable parseTask = () -> {
42+
Jws<Claims> claimsJws = parser.parseClaimsJws(token);
43+
Claims claims = claimsJws.getBody();
44+
assertEquals("baeldung", claims.getSubject());
45+
};
46+
47+
Thread thread1 = new Thread(parseTask);
48+
Thread thread2 = new Thread(parseTask);
49+
50+
thread1.start();
51+
thread2.start();
52+
53+
try {
54+
thread1.join();
55+
thread2.join();
56+
} catch (InterruptedException e) {
57+
Assertions.fail("Thread execution was interrupted");
58+
}
59+
}
60+
61+
@Test
62+
void givenDeprecatedParser_whenRequiringSpecificClaim_thenShouldParseSuccessfully() {
63+
JwtParser parser = Jwts.parser()
64+
.setSigningKey(key);
65+
66+
Claims claims = parser.parseClaimsJws(token)
67+
.getBody();
68+
69+
Assertions.assertEquals("baeldung", claims.getSubject());
70+
}
71+
72+
@Test
73+
public void givenDeprecatedParser_whenRequiringNonExistentClaim_thenShouldFail() {
74+
75+
JwtParser parser = Jwts.parser()
76+
.setSigningKey(key);
77+
78+
try {
79+
Claims claims = parser.parseClaimsJws(token)
80+
.getBody();
81+
Assertions.assertEquals(null, claims.get("non-existent-claim"));
82+
} catch (Exception e) {
83+
Assertions.assertEquals("JWT claims string is empty.", e.getMessage());
84+
}
85+
}
86+
87+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package com.baeldung.jwt.replace_deprecated_jwt_parser;
2+
3+
import java.util.Date;
4+
5+
import javax.crypto.SecretKey;
6+
7+
import org.junit.jupiter.api.Assertions;
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.Test;
10+
11+
import io.jsonwebtoken.Claims;
12+
import io.jsonwebtoken.Jws;
13+
import io.jsonwebtoken.JwtParser;
14+
import io.jsonwebtoken.Jwts;
15+
import io.jsonwebtoken.SignatureAlgorithm;
16+
import io.jsonwebtoken.security.Keys;
17+
18+
class JwtParserBuilderUnitTest {
19+
20+
private SecretKey key;
21+
private String token;
22+
23+
@BeforeEach
24+
public void setup() {
25+
key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
26+
token = Jwts.builder()
27+
.setSubject("baeldung")
28+
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))
29+
.signWith(key)
30+
.compact();
31+
}
32+
33+
@Test
34+
void givenJwtParserBuilder_whenParsingTokenInMultipleThreads_thenShouldBeThreadSafe() {
35+
JwtParser parser = Jwts.parserBuilder()
36+
.setSigningKey(key)
37+
.build();
38+
39+
Runnable parseTask = () -> {
40+
Jws<Claims> claimsJws = parser.parseClaimsJws(token);
41+
Claims claims = claimsJws.getBody();
42+
Assertions.assertEquals("baeldung", claims.getSubject());
43+
};
44+
45+
Thread thread1 = new Thread(parseTask);
46+
Thread thread2 = new Thread(parseTask);
47+
48+
thread1.start();
49+
thread2.start();
50+
51+
try {
52+
thread1.join();
53+
thread2.join();
54+
} catch (InterruptedException e) {
55+
Assertions.fail("Thread execution was interrupted");
56+
}
57+
}
58+
59+
@Test
60+
void givenJwtParserBuilder_whenRequiringSpecificClaim_thenShouldParseSuccessfully() {
61+
62+
JwtParser parser = Jwts.parserBuilder()
63+
.setSigningKey(key)
64+
.build();
65+
Claims claims = parser.parseClaimsJws(token)
66+
.getBody();
67+
68+
Assertions.assertEquals("baeldung", claims.getSubject());
69+
}
70+
71+
@Test
72+
void givenJwtParserBuilder_whenRequiringNonExistentClaim_thenShouldHandleGracefully() {
73+
JwtParser parser = Jwts.parserBuilder()
74+
.setSigningKey(key)
75+
.build();
76+
77+
try {
78+
Claims claims = parser.parseClaimsJws(token)
79+
.getBody();
80+
Assertions.assertNull(claims.get("non-existent-claim"));
81+
} catch (Exception e) {
82+
Assertions.assertEquals("JWT claims string is empty.", e.getMessage());
83+
}
84+
}
85+
86+
}

0 commit comments

Comments
 (0)