RuoYi-Vue-Plus之第三方登录

文档地址:点击这里

项目地址:点击这里

JustAuth文档:点击这里

SaToken文档:点击这里


第三方登录简单介绍

第三方登录就是通过第三方网站或者应用登录,例如谷歌登录。

具体实现方法

 /**
   * 登录-第三方授权登录
   *
   * @param body     登录信息
   * @param client   客户端信息
   */
  @Override
  public LoginVo login(String body, SysClient client) {
      SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class);
      // 校验参数
      ValidatorUtils.validate(loginBody);
      // 第三方登录是否成功
      AuthResponse<AuthUser> response = SocialUtils.loginAuth(
              loginBody.getSource(), loginBody.getSocialCode(),
              loginBody.getSocialState(), socialProperties);
      if (!response.ok()) {
          throw new ServiceException(response.getMsg());
      }
      AuthUser authUserData = response.getData();
      if ("GITEE".equals(authUserData.getSource())) {
          // 如用户使用 gitee 登录顺手 star 给作者一点支持 拒绝白嫖
          HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Vue-Plus")
                  .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken()))
                  .executeAsync();
          HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Cloud-Plus")
                  .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken()))
                  .executeAsync();
      }
//  通过authId获取第三方账号
      List<SysSocialVo> list = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid());
      if (CollUtil.isEmpty(list)) {
          throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!");
      }
      // 根据租户id获取第三方账号
      Optional<SysSocialVo> opt = list.stream().filter(x -> x.getTenantId().equals(loginBody.getTenantId())).findAny();
      if (opt.isEmpty()) {
          throw new ServiceException("对不起,你没有权限登录当前租户!");
      }
      SysSocialVo social = opt.get();
      // 查找用户
      SysUserVo user = loadUser(social.getTenantId(), social.getUserId());
      // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
      LoginUser loginUser = loginService.buildLoginUser(user);
      loginUser.setClientKey(client.getClientKey());
      loginUser.setDeviceType(client.getDeviceType());
      SaLoginModel model = new SaLoginModel();
      // 设置设备类型
      model.setDevice(client.getDeviceType());
      // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
      // 例如: 后台用户30分钟过期 app用户1天过期
      // 设置token有效期
      model.setTimeout(client.getTimeout());
      // 设置token最低活跃频率,例如:设置token最低活跃评率为30分钟,如果在30分钟内没有进行任何操作,则token过期
      model.setActiveTimeout(client.getActiveTimeout());
      // 设置扩展信息
      // Token挂载的扩展参数 (此方法只有在集成jwt插件时才会生效)
      model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
      // 生成token
      LoginHelper.login(loginUser, model);

      LoginVo loginVo = new LoginVo();
      loginVo.setAccessToken(StpUtil.getTokenValue());
      loginVo.setExpireIn(StpUtil.getTokenTimeout());
      loginVo.setClientId(client.getClientId());
      return loginVo;
  }

RuoYi-Vue-Plus之第三方登录
http://example.com/2024/05/11/RuoYi-Vue-Plus之第三方登录/
发布于
2024年5月11日
更新于
2024年5月18日
许可协议