iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0

在我們的上一篇文章中,我們介紹了基於Spring Boot的JWT(JSON Web Token)認證過濾器的基本實現。在這篇文章中,我們將進一步深入探討JWT在Spring Security中的整合,並詳細介紹如何實現一個 JwtService 來處理 JWT Token 的解析和驗證。

JwtService 是用來處理與JWT相關的所有操作,包括生成 Token、解析 Token、驗證 Token 的有效性等。在這裡,我們會聚焦於從 Token 中提取用戶信息。

import java.security.Key;
import java.sql.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

@Service
public class JwtService {

    private static final String SECRET_KEY = "65eFfeoZFi9sTNxfCUsPqzvH7piEoMldXuksQtbVpI+wBsQFyK8Qj6Md6pL1huot";

    public String extractUserName(String token) {
        return extractClaims(token, Claims::getSubject) ;
    }

    public <T> T extractClaims(String token, Function<Claims,T> ClaimsResolver) {
        final Claims claims =extractClaims(token);
        return ClaimsResolver.apply(claims);
    }

    public String generateToken(UserDetails userDetails) {
        return generateToken(new HashMap<>(), userDetails);
    }

    public String generateToken(
            Map<String, Object> extraClaims,
            UserDetails userDetails
    ) {
        return Jwts
                .builder()
                .setClaims(extraClaims)
                .setSubject(userDetails.getUsername())
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 10))
                .signWith(getSignInKey(), SignatureAlgorithm.ES256)
                .compact();
    }

    public boolean isTokenValid(String token, UserDetails userDetails) {
         final String username = extractClaims(token, Claims::getSubject);
         return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
    }

    private boolean isTokenExpired(String token) {
        return extractExpiration(token).before(new Date());
    }

    private java.util.Date extractExpiration(String token) {
        return extractClaims(token, Claims::getExpiration);
    }


    private Claims extractClaims(String token) {
        return Jwts
                .parserBuilder()
                .setSigningKey(getSignInKey())
                .build()
                .parseClaimsJws(token)
                .getBody();
    }

    private Key getSignInKey() {
        byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
        return Keys.hmacShaKeyFor(keyBytes);
    }
}

下篇文章來解釋這個 class


上一篇
Day 11 AuthenticationFilter
下一篇
Day 13 JWT認證服務 1
系列文
Spring Boot微服務架構:API設計與實現28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言