【实用工具】SpringBoot实现扫码登录

实现步骤

  1. 用户访问web端,选择扫码登录。此时生成二维码+二维码的图片地址展示。
  2. app端扫码(登录状态),传输用户token和二维码。二维码切换展示状态(待确认)
  3. 用户确认后,web端生成新的token信息。删除二维码的相关数据。

具体实现

web端展示二维码

    @Autowired
    private StringRedisTemplate redisTemplate;

    @PostMapping("create")
    @ResponseBody
    public LoginQrcodeVO createLoginQrcode() {
        String code = RandomUtil.randomString(6);
        redisTemplate.opsForValue().set(code, "", 3, TimeUnit.MINUTES);
        String imgUrl = "d:/qrcode.jpg";
        QrCodeUtil.generate(code, 300, 300, FileUtil.file(imgUrl));
        return new LoginQrcodeVO(code, imgUrl);
    }

app扫码

 private BaseResult handleQr(String code, String token) {
        boolean isLegal = JwtUtils.verify(token);
        if (!isLegal) {
            return BaseResult.error(AUTHENTICATION_FAILED);
        }
        String username = JwtUtils.getUsername(token);
        CodeVO codeVO = CodeUtils.getConfirmingCodeInfo(username, DEFAULT_AVATAR_URL);
        redisCache.setCacheObject(code, codeVO, DEFAULT_QR_EXPIRE_SECONDS, TimeUnit.SECONDS);
        LoginInfoVO loginInfoVO = new LoginInfoVO(address, browser, os, tmpToken);
        return BaseResult.success(SCAN_SUCCESS, loginInfoVO);
    }

确认登录

    private BaseResult confirmLogin(String code, String token) {
       	String username = JwtUtils.getUsername(token);
        String formalToken = JwtUtils.sign(username);
        CodeVO codeVO = CodeUtils.getConfirmedCodeInfo(username, DEFAULT_AVATAR_URL, formalToken);
        redisCache.setCacheObject(code, codeVO, DEFAULT_QR_EXPIRE_SECONDS, TimeUnit.SECONDS);
        return BaseResult.success(CONFIRM_SUCCESS);
    }

前端互动

  1. 使用定时器轮询获取二维码的状态
  2. 使用websocket,当app端扫码ok后,更新二维码的展示;当app确认登录,跳转首页。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值