接口鉴权的实现
【 微信公众号中,不同类型的公众号有不同的权限。 】
如何实现:
借助了appid和appsecret。
接口如何实现鉴权?
1、给每个客户端下发一个appid和appsecret
2、接口端给每个客户端设置不同的权限
3、客户端请求接口的时候,接口端根据客户端传递的appid,找到客户端对应的权限
4、判断用户是否具备调用该接口的权限。
为什么要做接口签名?
防止数据被篡改
1、主要为了防止别人在拦截到请求之后,可能会被篡改。
怎么去实现签名?
1、把客户端传递到数据通过 md5的方式,生成一个签名.
2、客户端把签名传递到服务端。
【验签】3、服务端根据客户端传递到数据,生一个对应的签名
【验签】4、对比服务端和客户端的签名,如果一样的话,说明没有被修改,如果不一样说明数据在传输的过程中被修改过。
签名的具体实现:如何生成签名。
1、拼接接口需要的参数。
2、对接口的数据按照key进行字典排序。【ksort方法】
3、把数组转换成key1=value1&key2=value2&key3=value3这样的字符串
4、对字符串进行Md5加密,把签名传递到服务端去
5、服务端进行验签。
6、验签通过正常访问接口,不通过返回验签失败
签名算法泄漏之后如何保证签名的安全?
签名算法泄漏的话,意味着别人也可以生存一个正确的签名。
解决办法:
在微信公众号开发的时候,申请测试号的时候 ,每个测试号都有一个 appid 和 appsecret。后边有一些接口都适用到了这些信息。
我们做的时候如何解决?
1、给调用接口的每个客户端下发一个appid和appsecret
2、在请求接口的参数中多加入一个参数 appid
3、拼接接口需要的参数。
4、对接口的数据按照key进行字典排序。【ksort方法】
5、把数组转换成key1=value1&key2=value2&key3=value3这样的字符串
6、把生成好的字符串,在后边追加 “&app_secret=服务端下发的密码”
7、对拼接好的字符串进行Md5加密,把签名传递到服务端去
8、服务端接受到数据之后,根据传递的appid 可以获取到对应app_secret
9、和客户端一样的方式,生成一个服务端的签名,
10、把服务端的签名 和 客户端的签名 做一个对比,如果一样正常请求,如果不一样说明数据被篡改了