[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;
|
---|
| 8 | import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.JwtService;
|
---|
| 9 | import org.springframework.security.core.userdetails.UserDetails;
|
---|
| 10 | import org.springframework.stereotype.Service;
|
---|
| 11 |
|
---|
| 12 | import java.security.Key;
|
---|
| 13 | import java.util.Date;
|
---|
| 14 | import java.util.Map;
|
---|
| 15 | import java.util.function.Function;
|
---|
| 16 |
|
---|
| 17 | @Service
|
---|
| 18 | public class JwtServiceImpl implements JwtService {
|
---|
| 19 | private final static String SECRET_KEY = "7191b1d33668d4a2316a02f9a40798b77bccd22173bd882c93a0a916a5e921d1";
|
---|
| 20 |
|
---|
| 21 | public String generateToken(UserDetails userDetails) {
|
---|
| 22 | return Jwts.builder().setSubject(userDetails.getUsername())
|
---|
| 23 | .setIssuedAt(new Date())
|
---|
| 24 | .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24))
|
---|
| 25 | .signWith(getSigninKey(), SignatureAlgorithm.HS256)
|
---|
| 26 | .compact();
|
---|
| 27 | }
|
---|
| 28 |
|
---|
| 29 | @Override
|
---|
| 30 | public String generateRefreshToken(Map<String, Object> extraClaims, UserDetails userDetails) {
|
---|
| 31 | return Jwts.builder().setClaims(extraClaims).setSubject(userDetails.getUsername())
|
---|
| 32 | .setIssuedAt(new Date())
|
---|
| 33 | .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7))
|
---|
| 34 | .signWith(getSigninKey(), SignatureAlgorithm.HS256)
|
---|
| 35 | .compact();
|
---|
| 36 | }
|
---|
| 37 |
|
---|
| 38 | private Key getSigninKey() {
|
---|
| 39 | byte[] key = Decoders.BASE64.decode(SECRET_KEY);
|
---|
| 40 | return Keys.hmacShaKeyFor(key);
|
---|
| 41 | }
|
---|
| 42 |
|
---|
| 43 | public String extractUsername(String token) {
|
---|
| 44 | return extractClaim(token, Claims::getSubject);
|
---|
| 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 |
|
---|
| 56 | public boolean isTokenValid(String token, UserDetails userDetails) {
|
---|
| 57 | final String username = extractUsername(token);
|
---|
| 58 | return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
|
---|
| 59 | }
|
---|
| 60 |
|
---|
| 61 |
|
---|
| 62 | private boolean isTokenExpired(String token) {
|
---|
| 63 | return extractClaim(token, Claims::getExpiration).before(new Date());
|
---|
| 64 | }
|
---|
| 65 | }
|
---|