1 | package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.impl;
|
---|
2 |
|
---|
3 | import io.jsonwebtoken.Claims;
|
---|
4 | import io.jsonwebtoken.Jwts;
|
---|
5 | import io.jsonwebtoken.SignatureAlgorithm;
|
---|
6 | import io.jsonwebtoken.io.Decoders;
|
---|
7 | import io.jsonwebtoken.security.Keys;
|
---|
8 | import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.User;
|
---|
9 | import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.JwtService;
|
---|
10 | import org.springframework.security.core.userdetails.UserDetails;
|
---|
11 | import org.springframework.stereotype.Service;
|
---|
12 |
|
---|
13 | import java.security.Key;
|
---|
14 | import java.util.Date;
|
---|
15 | import java.util.Map;
|
---|
16 | import java.util.function.Function;
|
---|
17 |
|
---|
18 | @Service
|
---|
19 | public class JwtServiceImpl implements JwtService {
|
---|
20 | private final static String SECRET_KEY = "7191b1d33668d4a2316a02f9a40798b77bccd22173bd882c93a0a916a5e921d1";
|
---|
21 |
|
---|
22 | public String generateToken(User user) {
|
---|
23 | return Jwts.builder().setSubject(user.getUsername())
|
---|
24 | .claim("name", user.getName())
|
---|
25 | .claim("role", user.getRole())
|
---|
26 | .claim("access", user.isHasAccess())
|
---|
27 | .claim("id", user.getId())
|
---|
28 | .setIssuedAt(new Date())
|
---|
29 | .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24))
|
---|
30 | .signWith(getSigninKey(), SignatureAlgorithm.HS256)
|
---|
31 | .compact();
|
---|
32 | }
|
---|
33 |
|
---|
34 | @Override
|
---|
35 | public String generateRefreshToken(Map<String, Object> extraClaims, UserDetails userDetails) {
|
---|
36 | return Jwts.builder().setClaims(extraClaims).setSubject(userDetails.getUsername())
|
---|
37 | .setIssuedAt(new Date())
|
---|
38 | .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7))
|
---|
39 | .signWith(getSigninKey(), SignatureAlgorithm.HS256)
|
---|
40 | .compact();
|
---|
41 | }
|
---|
42 |
|
---|
43 | private Key getSigninKey() {
|
---|
44 | byte[] key = Decoders.BASE64.decode(SECRET_KEY);
|
---|
45 | return Keys.hmacShaKeyFor(key);
|
---|
46 | }
|
---|
47 |
|
---|
48 | private Claims extractAllClaims(String token) {
|
---|
49 | return Jwts.parserBuilder().setSigningKey(getSigninKey()).build().parseClaimsJws(token).getBody();
|
---|
50 | }
|
---|
51 |
|
---|
52 | public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
|
---|
53 | final Claims claims = extractAllClaims(token);
|
---|
54 | return claimsResolver.apply(claims);
|
---|
55 | }
|
---|
56 |
|
---|
57 | @Override
|
---|
58 | public String extractUsername(String token) {
|
---|
59 | return extractClaim(token, Claims::getSubject);
|
---|
60 | }
|
---|
61 |
|
---|
62 | @Override
|
---|
63 | public boolean isTokenValid(String token, UserDetails userDetails) {
|
---|
64 | final String username = extractUsername(token);
|
---|
65 | return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
|
---|
66 | }
|
---|
67 |
|
---|
68 | @Override
|
---|
69 | public boolean isTokenExpired(String token) {
|
---|
70 | return extractClaim(token, Claims::getExpiration).before(new Date());
|
---|
71 | }
|
---|
72 | }
|
---|