JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传输信息。它是一种基于JSON的开放标准(RFC 7519),用于在网络应用环境间安全地将信息作为JSON对象传输。JWT通常用于身份验证和授权。
JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),这三部分通过.
分隔。
以下是一个简单的示例,展示如何在Spring Boot应用中实现JWT认证。
首先,在pom.xml
中添加JWT依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
创建一个工具类来生成和验证JWT:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtUtil {
private static final String SECRET_KEY = "secret";
public static String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 10小时
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public static boolean validateToken(String token, String username) {
final String extractedUsername = getUsernameFromToken(token);
return (extractedUsername.equals(username) && !isTokenExpired(token));
}
private static String getUsernameFromToken(String token) {
return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();
}
private static boolean isTokenExpired(String token) {
final Date expiration = getExpirationDateFromToken(token);
return expiration.before(new Date());
}
private static Date getExpirationDateFromToken(String token) {
return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getExpiration();
}
}
在控制器中使用JWT进行认证:
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class AuthController {
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
// 这里应该有验证用户名和密码的逻辑
if ("user".equals(username) && "password".equals(password)) {
return JwtUtil.generateToken(username);
}
return "Invalid credentials";
}
@GetMapping("/protected")
public String protectedEndpoint(@RequestHeader("Authorization") String token) {
if (token != null && token.startsWith("Bearer ")) {
token = token.substring(7);
if (JwtUtil.validateToken(token, "user")) {
return "Access granted";
}
}
return "Access denied";
}
}
原因:JWT有一个过期时间,一旦超过这个时间,令牌就会失效。
解决方法:客户端可以使用刷新令牌来获取新的访问令牌。
原因:如果JWT在传输过程中被篡改,服务器验证签名时会失败。
解决方法:始终通过HTTPS传输JWT,并且在服务器端严格验证签名。
原因:如果密钥泄露,任何人都可以生成有效的JWT。
解决方法:使用强密钥,并定期更换密钥。不要在客户端暴露密钥。
通过以上步骤和注意事项,可以在Spring Boot应用中有效地使用JWT进行用户认证和授权。
领取专属 10元无门槛券
手把手带您无忧上云