Api设计

API接口安全性验证方案设计

2017-06-01  本文已影响140人  FX_SKY

Http协议是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的。但是对我们的应用而言,它是需要有状态管理的,以便服务端能够准确的知道Http请求是哪个用户发起的,从而判断他是否有权限继续这个请求。这个过程就是常说的会话管理。

本文总结了3种常见的实现web应用会话管理的方式:

  1. 基于session
  2. 基于公钥/私钥
  3. 基于token

一、基于Session

Session就不用多说了,至于分布式Session实现方案 Java中通过Spring Session可以很方便的实现分布式Session管理。

二、基于公钥/私钥

事先给客户端分配一个app_id和app_secret,客户端调用接口的时候将业务参数按字母排序,首尾加app_secret再RSA2(推荐使用SHA256,MD5和SHA1已被攻破)生成前面sign,然后再将业务参数和sign发送给服务器,服务器端用相同的方式生成sign,如果sign相等则路由到业务方法,否则返回鉴权失败。

示例代码如下:

    private static final String UTF_8 = "UTF-8";

    public static String encode(Map<String, String> param, String secret, boolean encode) {
        Set<String> keysSet = param.keySet();
        Object[] keys = keysSet.toArray();
        Arrays.sort(keys);  //按参数名字典顺序排序

        StringBuilder sb = new StringBuilder(1024);
        for(int i=0; i<keys.length; i++) {
            if(i!=0){
                sb.append("&");
            }
            sb.append(keys[i]).append("=");
            String value = param.get(keys[i]);
            String valueString = "";
            if (null != value) {
                valueString = value;
            }
            if (encode) {
                sb.append(urlEncode(valueString));
            } else {
                sb.append(valueString);
            }
        }
        sb.append(secret);
        return DigestUtils.sha256Hex(sb.toString());
    }

    private static String urlEncode(String str) {
        try {
            return URLEncoder.encode(str, UTF_8);
        } catch (UnsupportedEncodingException e) {
            throw new IllegalArgumentException("unsupported encoding:"+UTF_8, e);
        }
    }

三、基于token

服务端动态生成token,客户端调用的时候需要回传token,参考 微信公共平台 access_token

3.1 JWT

JWT

参考资料

蚂蚁金服开发平台 签名与验签


微信公共平台 access_token


通过Spring Session实现新一代的Session管理

上一篇下一篇

猜你喜欢

热点阅读