、运行逻辑
-
JWT(JSON Web Token)是一种标准的身份认证和授权令牌,由头部(Header)、载荷(Payload)和签名(Signature)三部分组成。
-
例:Base64UrlEncode(Header).Base64UrlEncode(Payload).Base64UrlEncode(Signature)
-
头部(Header):头部是一个 JSON 对象,用于描述 JWT 的元数据和算法信息。通常包含两个字段:typ(令牌类型)和 alg(签名算法)。typ 字段指定令牌类型为 JWT,alg 字段指定使用的签名算法,例如 HS256、RS256 等。
-
载荷(Payload):载荷是一个 JSON 对象,用于存储实际的令牌数据。载荷包含一些标准的预定义字段,也可以包含自定义字段。JWT 标准定义了一些常用的字段,如 iss(签发者)、sub(主题)、exp(过期时间)、nbf(生效时间)、iat(签发时间)等。开发者可以根据自己的业务需求添加自定义字段。
-
签名(Signature):签名是用于验证 JWT 的完整性和真实性。签名是将头部和载荷以及一个密钥进行签名算法(如 HMAC、RSA)计算得到的一串字符串。服务器在验证 JWT 时,会通过同样的算法和密钥对头部和载荷进行签名计算,然后将计算结果与传递过来的签名进行比对。
-
-
这三个部分通过点号连接在一起,形成一个完整的 JWT。
-
JWT 的设计使得它具有可自包含性,即客户端可以解密和验证 JWT 来获得其中的信息,避免了额外的请求。同时,因为使用了签名进行验证,JWT 也可以防止非法篡改和伪造。需要注意的是,虽然 JWT 可以存储一些敏感信息,但不推荐在 JWT 中包含敏感数据,因为 JWT 的载荷是可以进行 Base64 解码的。通常敏感数据应该通过其他安全通道传输
-
二、代码构建
-
stackdin-auth
-
用户注册
@RequestMapping("/user") @RestController public class UserController { @Autowired private UserServiceFactory userServiceFactory; /** * 用户创建 * @param request 用户创建请求对象 * @return */ @PostMapping("create") public CommonResponse<?> create(@RequestBody UserCreateRequest request) { //创建多类型用户,根据请求中的用户类型查找对应的用户服务 UserService userService = userServiceFactory.findServiceByUserType(UserTypeEnums.ofCode(request.getUserType())); // 用户创建 userService.create(request); return CommonResponse.ok(); } } //用户类型 public enum UserTypeEnums { CONSUMER(1,"消费者"), PLATFORM(2,"平台"), CUSTOMER(3,"商家"); private final int code; private final String value; UserTypeEnums(int code,String value) { this.code = code; this.value = value; } public static UserTypeEnums ofCode(int code) { for (UserTypeEnums element : UserTypeEnums.values()) { if (element.code == code) { return element; } } throw new IllegalArgumentException("用户类型错误:" + code); } public int getCode() { return code; } public String getValue() { return value; } }
-
认证操作
public enum PlatformEnums { APP_CONSUMER_PLATFORM("app_consumer_platform","APP消费平台"), H5_CONSUMER_PLATFORM("h5_consumer_platform","H5消费平台"), PLATFORM_OPERATION_CONSOLE("platform_operation_console","平台运营后台"), CUSTOMER_OPERATION_CONSOLE("customer_operation_console","客户运营后台"), CUSTOMER_POS_CONSOLE("customer_pos_console","客户POS后台"); private final String code; private final String value; PlatformEnums(String code,String value) { this.code = code; this.value = value; } public static PlatformEnums ofCode(String code) { for (PlatformEnums element : PlatformEnums.values()) { if (element.code.equals(code)) { return element; } } throw new IllegalArgumentException("平台类型错误:" + code); } public String getCode() { return code; } public String getValue() { return value; } } /** * token 控制 */ @RestController @RequestMapping("/token") public class TokenController { @Autowired private UserServiceFactory userServiceFactory; /** * 用户登录接口 * @param request * @return */ @PostMapping("/login") public WebResponse<?> login(@RequestBody LoginRequest request) { //登录多平台用户,根据请求的平台找到对应的用户服务 UserService userService = userServiceFactory.findServiceByPlatform(PlatformEnums.ofCode(request.getPlatform())); // 用户登录 LoginInfo user = userService.login(request.getUsername(),request.getPassword()); // 获取登录token String token = TokenUtils.login("login",user.getUserId(),user); return WebResponse.success(token); } /** * 删除用户登录状态 * @param request * @return */ @DeleteMapping("logout") public WebResponse<?> logout() { TokenUtils.logout(); return WebResponse.success(); } /** * 刷新令牌有效期 * @param request * @return */ @PostMapping("refresh") public WebResponse<?> refresh() { TokenUtils.verifyAndRefreshToken(TokenUtils.getTokenValue()); return WebResponse.success(); } }
-