Skip to content

Commit b5e1cd0

Browse files
author
vitalii
committed
implemented generating jwt
1 parent 49c8a71 commit b5e1cd0

File tree

5 files changed

+112
-1
lines changed

5 files changed

+112
-1
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.sysgears.authentication.config;
2+
3+
import io.jsonwebtoken.security.Keys;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
7+
import java.security.Key;
8+
9+
@Configuration
10+
public class AuthConfig {
11+
@Bean
12+
public Key jwtSecretKey(JwtConfig config) {
13+
return Keys.hmacShaKeyFor(config.getSecret().getBytes());
14+
}
15+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.sysgears.authentication.config;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
import org.springframework.boot.context.properties.ConfigurationProperties;
6+
import org.springframework.context.annotation.Configuration;
7+
8+
@Getter
9+
@Setter
10+
@Configuration
11+
@ConfigurationProperties("jwt")
12+
public class JwtConfig {
13+
private String secret;
14+
private long accessTokenExpirationInSec;
15+
private long refreshTokenExpirationInSec;
16+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.sysgears.authentication.model.jwt;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class JwtUserIdentity {
7+
private final int id;
8+
private final String username;
9+
private final String passwordHash;
10+
private final String role;
11+
private final Boolean isActive;
12+
private final String email;
13+
private final String firstName;
14+
private final String lastName;
15+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.sysgears.authentication.service.jwt;
2+
3+
import com.sysgears.authentication.config.JwtConfig;
4+
import com.sysgears.authentication.model.jwt.JwtUserIdentity;
5+
import io.jsonwebtoken.Jwts;
6+
import io.jsonwebtoken.SignatureAlgorithm;
7+
import lombok.RequiredArgsConstructor;
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.springframework.stereotype.Service;
10+
11+
import java.security.Key;
12+
import java.time.Instant;
13+
import java.time.temporal.ChronoUnit;
14+
import java.util.Date;
15+
import java.util.HashMap;
16+
import java.util.Map;
17+
18+
@Slf4j
19+
@Service
20+
@RequiredArgsConstructor
21+
public class JWTGenerator {
22+
private final Key secretKey;
23+
private final JwtConfig jwtConfig;
24+
25+
//todo: need to separate generation and parsing JWT.
26+
public String generateToken(JwtUserIdentity identity) {
27+
Map<String, Object> claims = new HashMap<>();
28+
claims.put("identity", identity);
29+
log.debug("Generating new access JWT for user {}", identity.getId());
30+
return Jwts.builder()
31+
.setClaims(claims)
32+
.setIssuedAt(Date.from(Instant.now()))
33+
.setExpiration(Date.from(Instant.now().plus(jwtConfig.getAccessTokenExpirationInSec(), ChronoUnit.SECONDS)))
34+
.setHeaderParam("typ", "JWT")
35+
.signWith(secretKey, SignatureAlgorithm.HS256)
36+
.compact();
37+
}
38+
39+
public String generateRefreshToken(JwtUserIdentity identity) {
40+
Map<String, Object> claims = new HashMap<>();
41+
claims.put("id", identity.getId());
42+
log.debug("Generating new refresh JWT for user {}", identity.getId());
43+
return Jwts.builder()
44+
.setClaims(claims)
45+
.setIssuedAt(Date.from(Instant.now()))
46+
.setExpiration(Date.from(Instant.now().plus(jwtConfig.getRefreshTokenExpirationInSec(), ChronoUnit.SECONDS)))
47+
.setHeaderParam("typ", "JWT")
48+
.signWith(secretKey, SignatureAlgorithm.HS256)
49+
.compact();
50+
}
51+
52+
53+
public String getAllClaimsFromToken(String token) {
54+
return Jwts.parserBuilder()
55+
.setSigningKey(secretKey)
56+
.build()
57+
.parseClaimsJws(token)
58+
.toString();
59+
}
60+
}

packages/server-java/app/src/main/resources/application.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,9 @@ graphiql:
3232
enabled: true
3333
endpoint:
3434
subscriptions: /graphql
35-
mapping: /graphiql
35+
mapping: /graphiql
36+
37+
jwt:
38+
secret: "676918AB4D29BFE59CCB943F3C09F5CC8FB3A8511E23E502B67DE95AB9A9D00C"
39+
access-token-expiration-in-sec: 3600
40+
refresh-token-expiration-in-sec: 604800

0 commit comments

Comments
 (0)