JAVA-企业微信自建应用OAuth2授权完后,签名校验既返回成功又返回失败

我这边是先经过了OAuth2的授权登录,之前已经讲过怎么做的,遇到的问题就出在授权这里。先看官方文档的流程图:

 OAuth2授权的时候,会重定向到redirect_uri地址,并且携带参数,这个地址一般也就是登录进去的首页。

说下我遇到的问题以及怎么解决的:

正常账号密码普通登录,签名没问题,但是OAuth2的授权后,签名就报错,而且报的错还不一般,看图:

 既有成功又有失败,看到这个直接给我整不会了。普通登录和OAuth2授权后,签名都是同一个接口,而且传参数据没变,于是我又回去看官方文档:

 当场尬住.....我这个url是从数据库里拿的企业微信的可信域名...但是第一张流程图已经说了,重定向跳转的时候会带上code和state参数...于是打印了一下跳转的url:

 看到这,应该明白了吧,虽然OAuth2的重定向跳转的页面和普通登录进来的一样,但是他会把code等参数给你,所以url已经改变了,官方文档说会校验当前网页的url,#号前的部分。普通登录和OAuth2的签名想要共用,就需要判断前端有没有把url传给我(这个url前端传或者后端拼接都可以),根据这个url或者可信域名当做url去生成签名,就可以过校验了。

String sign = WeiXinQiYeUtil.sign(Objects.isNull(param.getUrl()) ? dns : param.getUrl(), genNonce, timestamp, jsapiTicket);
    /**
     * 签名
     * @param url 路径
     * @param nonce 字符串
     * @param timestamp 时间戳
     * @param ticket
     * @return
     * @throws Exception
     */
    public static String sign(String url, String nonce, Long timestamp, String ticket) throws Exception {
        //签名规则
        String plain = String.format("jsapi_ticket=%s&noncestr=%s&timestamp=%d&url=%s", ticket, nonce, timestamp, url);
        logger.info("plain:" + plain);
        try {
            MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
            sha1.reset();
            sha1.update(plain.getBytes(StandardCharsets.UTF_8));
            return bytesToHex(sha1.digest());
        } catch (NoSuchAlgorithmException e) {
            // throw new LeysenException("jsapi_ticket计算签名错误");
            throw new Exception("jsapi_ticket计算签名错误");
        }
    }

ok,完美解决

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值