我这边是先经过了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×tamp=%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,完美解决