医疗网站如何做优化,公司做网站多,网站建设经典文章,网络规划与设计参考文献是什么?为什么需要令牌令牌的出现令牌三步走常见令牌 JWT(JSON Web Token) jwt demo OAuth2.0(不透明令牌) 是什么? 身份令牌是现代Web应用和移动应用中用于管理用户会话的核心机制 为什么需要令牌 没有令牌的世界——Cookie/Session#xff08;基于服务器存储的会话…是什么?为什么需要令牌令牌的出现令牌三步走常见令牌JWT(JSON Web Token)jwt demoOAuth2.0(不透明令牌)是什么?身份令牌是现代Web应用和移动应用中用于管理用户会话的核心机制为什么需要令牌没有令牌的世界——Cookie/Session基于服务器存储的会话 的传统模式你输入用户名密码登录。服务器验证通过在服务器的内存里创建一个Session会话记录并生成一个对应的 Session ID会话ID。服务器把 Session ID 发给浏览器浏览器存在 Cookie 里。以后每次请求浏览器带上这个 ID。关键点服务器收到 ID 后必须去自己的内存或数据库里查找这个 Session 是否存在、是否过期令牌的出现无状态Stateless。服务器不再存储 Session而是把用户信息如用户ID、昵称、过期时间经过加密直接生成一个令牌交给客户端。 客户端每次带着这个令牌来服务器只需要验证令牌本身的签名就能确认身份无需查数据库或内存令牌三步走常见令牌JWT(JSON Web Token)eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cJWT 由三部分组成Header头部、Payload负载和Signature签名头部Header声明了加密算法比如用了什么哈希算法。载荷Payload存放实际数据的地方。比如用户IDuser_id: 123、用户名、过期时间exp。注意这里的数据只是用Base64编码可解码看到原文所以千万不要在JWT里存放密码等敏感信息。签名Signature这是最关键的防伪部分。服务器使用只有自己知道的密钥对前两部分进行加密生成签名。如果有人篡改了令牌里的用户ID签名就无法匹配服务器会直接拒绝。jwt demodependencies dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.11.5/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-impl/artifactId version0.11.5/version scoperuntime/scope /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-jackson/artifactId !-- 或 jjwt-gson用于 JSON 处理 -- version0.11.5/version scoperuntime/scope /dependency /dependenciespackage com.jysemel; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import javax.crypto.SecretKey; import java.util.Date; import java.util.HashMap; import java.util.Map; public class JwtExample { // 生成一个足够安全的签名密钥实际应用中应从配置文件读取或使用密钥库 private static final SecretKey SECRET_KEY Keys.secretKeyFor(SignatureAlgorithm.HS256); // HS256 需要 256位密钥 // 过期时间1小时毫秒 private static final long EXPIRATION_TIME 3600000; public static void main(String[] args) { // 1. 生成 JWT String token generateToken(user123, admin); System.out.println(生成的 JWT\n token); // 2. 验证并解析 JWT parseToken(token); } /** * 生成 JWT * param subject 用户标识如用户名、用户ID * param role 用户角色自定义声明示例 * return JWT 字符串 */ public static String generateToken(String subject, String role) { // 设置头部可选默认即可 MapString, Object header new HashMap(); header.put(typ, JWT); // 设置载荷Claims JwtBuilder builder Jwts.builder() .setHeader(header) // 头部 .setSubject(subject) // 主题通常是用户标识 .setIssuedAt(new Date()) // 签发时间 .setExpiration(new Date(System.currentTimeMillis() EXPIRATION_TIME)) // 过期时间 .setIssuer(MyApp) // 签发者 .setAudience(MyClient) // 接收方 .setId(java.util.UUID.randomUUID().toString()) // JWT ID用于防止重放攻击 .claim(role, role) // 自定义声明角色 .claim(dept, engineering) // 自定义声明部门 .signWith(SECRET_KEY); // 签名 return builder.compact(); } /** * 解析 JWT验证签名并提取数据 * param token JWT 字符串 */ public static void parseToken(String token) { try { // 创建解析器设置签名密钥 JwtParser parser Jwts.parserBuilder() .setSigningKey(SECRET_KEY) .build(); // 解析 JWT得到 JwsClaims 对象 JwsClaims jws parser.parseClaimsJws(token); // 获取头部 JwsHeader header jws.getHeader(); System.out.println(\n--- 解析结果 ---); System.out.println(算法 header.getAlgorithm()); System.out.println(类型 header.getType()); // 获取载荷 Claims claims jws.getBody(); System.out.println(主题subject claims.getSubject()); System.out.println(签发时间 claims.getIssuedAt()); System.out.println(过期时间 claims.getExpiration()); System.out.println(签发者 claims.getIssuer()); System.out.println(接收方 claims.getAudience()); System.out.println(JWT ID claims.getId()); System.out.println(角色自定义声明 claims.get(role)); System.out.println(部门自定义声明 claims.get(dept)); } catch (ExpiredJwtException e) { System.err.println(JWT 已过期 e.getMessage()); } catch (UnsupportedJwtException e) { System.err.println(不支持的 JWT e.getMessage()); } catch (MalformedJwtException e) { System.err.println(JWT 格式错误 e.getMessage()); } catch (SignatureException e) { System.err.println(JWT 签名验证失败 e.getMessage()); } catch (IllegalArgumentException e) { System.err.println(JWT 参数非法 e.getMessage()); } } }OAuth2.0(不透明令牌)OAuth2.0 是一个开放授权标准它允许用户授权第三方应用访问其资源而无需将用户名和密码提供给第三方应用。OAuth 2.0 授权码模式流程图时序图OAuth 2.0 核心角色关系图