05-认证中心

、运行逻辑

  1. JWT(JSON Web Token)是一种标准的身份认证和授权令牌,由头部(Header)、载荷(Payload)和签名(Signature)三部分组成。

    1. 例:Base64UrlEncode(Header).Base64UrlEncode(Payload).Base64UrlEncode(Signature)

      1. 头部(Header):头部是一个 JSON 对象,用于描述 JWT 的元数据和算法信息。通常包含两个字段:typ(令牌类型)和 alg(签名算法)。typ 字段指定令牌类型为 JWT,alg 字段指定使用的签名算法,例如 HS256、RS256 等。

      2. 载荷(Payload):载荷是一个 JSON 对象,用于存储实际的令牌数据。载荷包含一些标准的预定义字段,也可以包含自定义字段。JWT 标准定义了一些常用的字段,如 iss(签发者)、sub(主题)、exp(过期时间)、nbf(生效时间)、iat(签发时间)等。开发者可以根据自己的业务需求添加自定义字段。

      3. 签名(Signature):签名是用于验证 JWT 的完整性和真实性。签名是将头部和载荷以及一个密钥进行签名算法(如 HMAC、RSA)计算得到的一串字符串。服务器在验证 JWT 时,会通过同样的算法和密钥对头部和载荷进行签名计算,然后将计算结果与传递过来的签名进行比对。

    2. 这三个部分通过点号连接在一起,形成一个完整的 JWT。

    3. JWT 的设计使得它具有可自包含性,即客户端可以解密和验证 JWT 来获得其中的信息,避免了额外的请求。同时,因为使用了签名进行验证,JWT 也可以防止非法篡改和伪造。需要注意的是,虽然 JWT 可以存储一些敏感信息,但不推荐在 JWT 中包含敏感数据,因为 JWT 的载荷是可以进行 Base64 解码的。通常敏感数据应该通过其他安全通道传输

二、代码构建

  1. stackdin-auth

    1. 用户注册

      @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;
          }
      
      }
    2. 认证操作

      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();
          }
      
      
      
      }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值