美文网首页
认证设计

认证设计

作者: 大龄程序员在帝都 | 来源:发表于2017-03-14 21:11 被阅读40次

    为什么](http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html)

    微信开发者认证模式

    有几篇关于认证的设计很不错

    微信开发者接入也是采用这种认证方式!!!

    Paste_Image.png
    融云设计

    思路参考融云的认证设计

    一、接入商设计:

    比如一个接入商(要接入你们的服务APP),如果一个APP要接入你们的服务,如何保证是自己认证的用户呢?
    之前的设计思路:
    每个接入商有一个AppSecret,这个是有服务商提供的,不经过网络传输设计思路:

    1、生成一个随机数nonce 2、时间精确到秒timestamp 3、appKey(标识APP的,公开的明文)

    然后通过AppSecret加上上面的几个参数进行 SHA加密得出sign,这样把appKey,timestamp以及nonce和sign四个参数传输到服务器端,注意AppSecret不经过网络传输,只进行加密!

    传输到服务器以后,服务器拿到四个参数,服务器端也会保存AppSecret,服务器通过这几个参数进行加密得到一个sign,如果客户端的sign和服务器端的sign相同了,就证明认证成功!

    注意为什么一定要有一个timestamp,因为这个是判断时间是否在一分钟或者是否是在平均响应时间之内的,如果超过这个时间,就有可能是伪造的请求。因为你截获了请求进行伪造也不可能这么快,为了安全,这个时间验证可以更短一点。毕竟伪造请求也需要时间的。

    如果这个认证太浪费服务器性能,可以5分钟认证一次,第一次认证后在服务器端生成一个token,传输到客户端,这个token在服务器端保存5分钟,如果过了五分钟需要重新认证,这样就不用每次请求都认证了,浪费性能和时间了!!!

    这是一个比较好的思路,比我想的对参数进行排序后加密好多了!!!

    代码思路

    String nonce = String.valueOf(Math.random() * 1000000);
    String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
    StringBuilder toSign = new StringBuilder(appSecret).append(nonce).append(timestamp);
    String sign = CodeUtil.hexSHA1(toSign.toString());
    
    
    conn.setRequestProperty(APPKEY, appKey);
    conn.setRequestProperty(NONCE, nonce);
    conn.setRequestProperty(TIMESTAMP, timestamp);
    conn.setRequestProperty(SIGNATURE, sign);
    

    为什么要返回access_token的过期时间

    谈谈下图为什么会返回这个过期时间,如果被攻击,服务器可以直接修改这个时间到最短,这样就不容易被伪造攻击了,另外这个过期时间一定要带上,客户端也要根据这个时间每次根据这个时间去调整什么时间请求!!!

    {"access_token":"ACCESS_TOKEN","expires_in":7200}
    
    Paste_Image.png

    这篇貌似不错

    为什么提供服务器IP地址列表的接口

    另外微信也涉及了获取微信服务器的ip地址列表的请求,这样放到客户端可以有效防止中间人攻击:

    Paste_Image.png

    为什么要返回那个随机数,也便于客户端确认是否有中间人攻击

    Paste_Image.png

    相关文章

      网友评论

          本文标题:认证设计

          本文链接:https://www.haomeiwen.com/subject/npwhnttx.html