利用Token校验订单用户真实性

在几天前,博主的训练平台都大致的搭建好了,准备着手开始Ai的一个开发,代理跑起来时发现代理居然可以随意的使用它人id进行交易(我写错了id),我的交易流程是:token获取账户>用户下单>前端获取用户id>后端验证用户真实性(Token)>验证成功执行交易,看似没毛病,当时我也觉得没毛病,可到了测试才发现这个大问题,用户只需拿到自己的token在下单时修改api里的id,就可以实现盗用它人的资金或持股

3b4a60176e80455e8a09f9477158482b.png

这该怎么解决呢?让用户自己校验?这怎么可能,让前端验证id是否一样?可代理这边如何拦截?

151e7d010b294992a9f881e32da2588e.jpeg

正当博主准备躺平的时候,突然发觉!token就是唯一的呀,那我可不可以使用token来验证双方(请求方和接收id)的id是否一致?话不多说开始写

新建一个方法,用来获取token值里的id

    public String tokenLoginRequestApi(HttpServletRequest httpServletRequest) {
        Cookie[] cookies = httpServletRequest.getCookies();
        String token = null;
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("token".equals(cookie.getName())) {
                    token = cookie.getValue();
                    break;
                }
            }
        }
        assert token != null;
        String userId = JWT.decode(token).getAudience().get(0);
        User user = userService.getById(userId);
        return user.getId();
    }

在买卖方法中试试能不能成功(代码展示相关部分)

@UserLoginToken
    @PostMapping("/buy")
    @ResponseBody
    public String buy(HttpServletRequest request) {
        String resultUserData = tokenRequestApiController.tokenLoginRequestApi(request);
        User buyer = userMapper.queryById(buyOrders.getId());
        System.out.println("aaa" + resultUserData);
        System.out.println(buyer.getId());
}

158c9c3464c545fbaa69797f4764a8b8.png

可以看到是一致的, 接下来开始验证

@UserLoginToken
    @GetMapping("/getbuy")
    @ResponseBody
    public String buy(HttpServletRequest request) {
        String resultUserData = tokenRequestApiController.tokenLoginRequestApi(request);
        User buyer = userMapper.queryById(buyOrders.getId());
        if (Objects.equals(resultUserData, buyer.getId())) {
            //验证一致后继续操作
        }else {
            model.addAttribute("message", ACCOUNT_ISSUE_MESSAGE);
            //ACCOUNT_ISSUE_MESSAGE 为 "private static final String ACCOUNT_ISSUE_MESSAGE = "风控系统检测到您的环境有账户问题,请联系工作人员!";"
        }
        return Objects.requireNonNull(model.getAttribute("message")).toString();
}

测试:使用用户对应账号,成交没有问题

cc99498934f94faab582f9116a57cd11.png

测试token账号与用户账号不一致(用户使用他人账号),报错拦截

79b8acaf214f49b6abb795726662e5f4.png

吐槽一下:两行代码也能叫风控?哈哈哈说的好高级,在实现后我觉得博主我太牛x了,这样都能想到解决办法,必须写个文章纪念一下,但写完文章又感觉也不是啥高级技术难题,在考虑要不要发,但总有菜鸟成为雄鹰的过程,能帮助到一个人那我写的就有意义,实现起来并不难,主要在于一个思想上的转变。

 

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值