[d8b6c91] | 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;
|
---|
[b248810] | 8 | import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.User;
|
---|
[d8b6c91] | 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 |
|
---|
[b248810] | 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())
|
---|
[d8b6c91] | 27 | .setIssuedAt(new Date())
|
---|
| 28 | .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24))
|
---|
| 29 | .signWith(getSigninKey(), SignatureAlgorithm.HS256)
|
---|
| 30 | .compact();
|
---|
| 31 | }
|
---|
| 32 |
|
---|
| 33 | @Override
|
---|
| 34 | public String generateRefreshToken(Map<String, Object> extraClaims, UserDetails userDetails) {
|
---|
| 35 | return Jwts.builder().setClaims(extraClaims).setSubject(userDetails.getUsername())
|
---|
| 36 | .setIssuedAt(new Date())
|
---|
| 37 | .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7))
|
---|
| 38 | .signWith(getSigninKey(), SignatureAlgorithm.HS256)
|
---|
| 39 | .compact();
|
---|
| 40 | }
|
---|
| 41 |
|
---|
| 42 | private Key getSigninKey() {
|
---|
| 43 | byte[] key = Decoders.BASE64.decode(SECRET_KEY);
|
---|
| 44 | return Keys.hmacShaKeyFor(key);
|
---|
| 45 | }
|
---|
| 46 |
|
---|
| 47 | private Claims extractAllClaims(String token) {
|
---|
| 48 | return Jwts.parserBuilder().setSigningKey(getSigninKey()).build().parseClaimsJws(token).getBody();
|
---|
| 49 | }
|
---|
| 50 |
|
---|
| 51 | public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
|
---|
| 52 | final Claims claims = extractAllClaims(token);
|
---|
| 53 | return claimsResolver.apply(claims);
|
---|
| 54 | }
|
---|
| 55 |
|
---|
[19398ad] | 56 | @Override
|
---|
| 57 | public String extractUsername(String token) {
|
---|
| 58 | return extractClaim(token, Claims::getSubject);
|
---|
| 59 | }
|
---|
| 60 |
|
---|
| 61 | @Override
|
---|
[d8b6c91] | 62 | public boolean isTokenValid(String token, UserDetails userDetails) {
|
---|
| 63 | final String username = extractUsername(token);
|
---|
| 64 | return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
|
---|
| 65 | }
|
---|
| 66 |
|
---|
[19398ad] | 67 | @Override
|
---|
| 68 | public boolean isTokenExpired(String token) {
|
---|
[d8b6c91] | 69 | return extractClaim(token, Claims::getExpiration).before(new Date());
|
---|
| 70 | }
|
---|
| 71 | }
|
---|