
本文共 7506 字,大约阅读时间需要 25 分钟。
JWT���������������������
JWT������
JWT���JSON Web Token���������������������������������������������������������������������������������������������������������RFC 7519���������������������������������Token���������������������������������Token������������������������������������������������������������������
JWT������
JWT���������������������Header���������������Payload���������������Signature���������������
Header
contiene���������������alg
���������������������������������������������HS256
���typ
���������Token���������������������JWT
���
Payload
������������������������������������������������������������������- ���������������
iss
������������������sub
���������������aud
������������������exp
���������������������iat
���������������������jti
���Token������������������ - ���������������������������������������������
- ���������������������������������������������������
Signature
���������������Header���Payload���������������������������������������������������- base64UrlEncode Header + "." + base64UrlEncode Payload������������������������������
- ���Header���Payload���Signature������������������Token������������.`������������
JWT���������
���������
- ���������������������������������������Token������������������
- ���������������������������������������������������Session���������
- ������������������Token���JSON������������������������������������
���������
- ������������������Base64���������Payload���������������������������������������������������
- ������������Token������������������Token������������������������
- ������������������Token���������Session���������������������������Token���
Cookie+Session���JWT������
��������� | Cookie+Session | JWT |
---|---|---|
������������ | ���������������Session������������������Session ID��� | ���������������Token������������������Token��� |
��������� | ��������������������������������������������������� | Token��������������������������� |
������������ | ������Redis������������������Session��������� | Token��������������������������������� |
JWT������������
1. ������������
������ JWT���������������com.auth0:java-jwt
���io.jsonwebtoken:jjwt
���������������������������������
implementation 'com.auth0:java-jwt:3.10.3'// ������implementation 'io.jsonwebtoken:jjwt:0.9.1'
2. ������������
���application.yml
��������� JWT ���������
server: port: 8080spring: application: name: springboot-jwt config: jwt: secret: abc123 expire: 300000
3. ������JWT���������
������IJwtUtil
������������������������������������
Java-JWT���������
import com.auth0.jwt.JWT;import com.auth0.jwt.JWTVerifier;import com.auth0.jwt.algorithms.Algorithm;import com.auth0.jwt.exceptions.JWTDecodeException;import com.auth0.jwt.exceptions.JWTVerificationException;import com.example.util.IJwtUtil;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import java.util.Date;@Component("javaJwtUtil")public class JavaJwtUtil implements IJwtUtil { @Value("${config.jwt.expire}") private long expireTime; @Value("${config.jwt.secret}") private String secretKey; @Override public String createToken(String userId) { try { Date expiration = new Date(System.currentTimeMillis() + expireTime); Algorithm algorithm = Algorithm.HMAC256(secretKey); return JWT.create() .withExpiresAt(expiration) .withAudience(userId) .sign(algorithm); } catch (Exception e) { return null; } } // ������������������...}
JJWT���������
import io.jsonwebtoken.Claims;import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;@Component("jJwtUtil")public class JJwtUtil implements IJwtUtil { @Value("${config.jwt.expire}") private long expireTime; @Value("${config.jwt.secret}") private String secretKey; @Override public String createToken(String userId) { Date expiration = new Date(); return Jwts.builder() .setExpirationDate(expiration.getTime() + expireTime) .setSubject(userId) .signWith(SignatureAlgorithm.HS256, secretKey) .compact(); } // ������������...}
4. ���������������
���������������������������Token������������
@Slf4jimport org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.web.servlet.HandlerInterceptor;@Componentpublic class JwtInterceptor implements HandlerInterceptor { @Autowired @Qualifier("jJwtUtil") private IJwtUtil jwtUtil; public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // ���������������Token��������������� if (!(handler instanceof HandlerMethod)) { return true; } String uri = request.getRequestURI(); if (isWhiteUrl(uri)) { return true; } // ���Header������������������Token String token = request.getHeader("token"); if (StringUtils.isEmpty(token)) { token = request.getParameter("token"); if (StringUtils.isEmpty(token)) { throw new RuntimeException("������Token"); } } // ������Token if (!jwtUtil.verifyToken(token)) { log.error("Token������"); return false; } // ������������������ String userId = jwtUtil.getUserByToken(token); String userName = jwtUtil.getUserNameByToken(token); log.debug("������ID: {}, ���������: {}", userId, userName); return true; } private ListgetWhiteList() { return new Fixes({ "/auth/login", "/error" }); }}
5. ���������������
������Token������������
@RestController@RequestMapping("/auth")public class AuthController { @Autowired @Qualifier("jJwtUtil") private IJwtUtil jwtUtil; @RequestMapping("/login") public String login() { // ������������������������ID���������Token String userId = 5L + ""; String token = jwtUtil.createToken(userId); log.info("������Token: {}", token); return token; } @RequestMapping("/info") public String info() { return "������������"; }}
���������������
Token���������������������
HTTP Header
���������������������������������
������Token������:
- Header:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpVA...
- Payload:
{ "sub": "123", "name": "John Doe", "iat": "..." }
- Signature: base64UrlEncode(Header + "." + Payload)������������������������
������Token������:
- ������Token������������������������������������500���������
- ������������������Token������������������������������
������������������
Token������:
- Real-time������Token������������������������Token���
- Redis������Token���������������������������������������������������������
���������������:
- ������HTTPS������Token���
- ������Token���������������������������������������������
���������������������������������������������������JWT���������������������������������������������������������
发表评论
最新留言
关于作者
