• 如何设计对外接口


    对外接口案例

    钉钉后台接口

    1、后台给用户生成app_key和app_secret。
    2、用户调用gettoken接口通过app_key和app_secret获取token。
    3、用户使用token请求具体业务接口。

    // 获取token
        public static String getAccessToken(){
            String token = null;
            try {
                DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
                OapiGettokenRequest request = new OapiGettokenRequest();
                request.setAppkey(APP_KEY);
                request.setAppsecret(APP_SECRET);
                request.setHttpMethod("GET");
                OapiGettokenResponse response = client.execute(request);
                token = response.getAccessToken();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return token;
        }
      // 调用业务接口 
         public static List listSub(Long deptId) throws ApiException {
            String token = getToken();
            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
            OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
            if (Objects.nonNull(deptId))
                req.setDeptId(deptId);
            req.setLanguage("zh_CN");
            OapiV2DepartmentListsubResponse rsp = client.execute(req, token);
            return rsp.getResult();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    多麦接口

    1、获取app_id和app_app_secret。
    2、对公共请求参数按照一定的排列方式做MD5签名(一般按照askII码升序排列,签名的主要作用是防止参数被篡改,验证请求是否合法)。
    3、将除了app_secret的公共请求参数拼接到url后面。(多麦会根据app_secret验证签名,所以不能暴露app_secret,非法访问者因为没有app_secret所以不能调用接口)
    4、将业务参数拼接以JSON的格式传输。
    在这里插入图片描述

    支付接口

    1、获取公钥和私钥,拿自己的私钥兑换平台私钥
    2、同过公钥和RSA算法生成sign。
    3、携带sign请求接口,平台通过给到的私钥验证参数。
    4、平台回调接口通过兑换的私钥验证参数。

    登入拦截,SSO,JWT

    登入拦截过程

    1、用户输入账户密码登入。
    2、服务器为每个会话保存session。(每个浏览器的session独立,在浏览器的A标签页登入,B标签页也具有访问权限,同一个浏览器保存相同的session,postmansession独立)
    例如:在A页面登入
    在这里插入图片描述复制链接到B标签页,链接可以打开
    在这里插入图片描述打开新的浏览器页面被重定向到登入页面
    在这里插入图片描述

    3、用户请求其他的接口,服务器验证session中是否存在对象从而决定是否可以访问接口

    问题:分布式系统中session不共享。

    SSO

    1、用户输入账户密码,进入网关,官网验证信息。
    2、网关验证通过返回token(根据密钥和加密算法生成token),客户端将token写到cookie中。
    3、用户再访问微服务时,经过网关,网关对token进行解析。解析成功允许访问,解析失败或者token过期拒绝访问。
    这种方式是无状态登录,服务器不保存用户状态,状态保存到客户端,信息存在安全性问题,需要加密。

    JWT

    什么是JWT

    Json web token (JWT),是单点登入的实现方式。JWT加密JSON,保存在客户端,不需要在服务端保存会话信息。
    jwt示例:

    eyJhbGciOiJIUzI1NiIsIlR5cGUiOiJKd3QiLCJ0eXAiOiJKV1QifQ.eyJ1c2VyTWFwIjoie1wibmlja25hbWVcIjpcIuaWueW6hlwiLFwidXNlcklkXCI6XCI4NDBcIn0iLCJleHAiOjE2NjAxOTM4NTh9.WEcFSOAATkD5iI5D4UoX8ds5QYHYHINPEgc0AMNsxiw
    
    • 1

    以点分割包括三个部分
    header 头部,包含声明类型和加密算法
    payload 负载,就是有效数据,一般是用户信息
    signature 签名,数据的认证信息

    JAVA使用JWT

    1、引入jar包

            
                com.auth0
                java-jwt
                3.4.1
            
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、引入工具类

    public class JwtUtil {
    //jwt会对字符串使用时间戳和密钥加盐,不同的时间戳和密钥的加密结果不同,token过期则解析结果为null
    //用户不知道密钥和token的内容所以无法伪造token。
        // 过期时间为15秒,保证链接被复制失效
        private static final long EXPIRE_TIME = 10 * 1000;
        // 私钥
        private static final String TOKEN_SECRET = "miyao";
    
        /**
         * 生成签名,10秒钟过期
         * @param **username**
         * @param **password**
         * @return
         */
        public static String sign(String s) {
            try {
                // 设置过期时间
                Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
                // 私钥和加密算法
                Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
                // 设置头部信息
                Map header = new HashMap<>(2);
                header.put("Type", "Jwt");
                header.put("alg", "HS256");
                // 返回token字符串
                return JWT.create()
                        .withHeader(header)
                        .withClaim("id", s)
                        .withExpiresAt(date)
                        .sign(algorithm);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    
        /**
         * 检验token是否正确
         * @param **token**
         * @return
         */
        public static String verify(String token){
            try {
                Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
                JWTVerifier verifier = JWT.require(algorithm).build();
                DecodedJWT jwt = verifier.verify(token);
                String s= jwt.getClaim("id").asString();
                return s;
            } catch (Exception e){
                return null;
            }
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    无论是单体系统中的session实现登录拦截,还是分布式系统中的单点登录还是JWT,目标都是鉴权,鉴定是否有接口的访问权限。

    加密算法

    1、对称式加密技术

    对称式加密就是加密和解密使用同一个密钥,通常称之为“Session Key ”这种加密技术在当今被广泛采用,如美国政府所采用的DES加密标准就是一种典型的“对称式”加密法,它的Session Key长度为56bits。
    常见对称式加密技术:DES、3DES、TDEA、Blowfish、RC5、IDEA算法

    2、非对称式加密技术

    非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”,它们两个必需配对使用,否则不能打开加密文件。这里的“公钥”是指可以对外公布的,“私钥”则不能,只能由持有人一个人知道。它的优越性就在这里,因为对称式的加密方法如果是在网络上传输加密文件就很难不把密钥告诉对方,不管用什么方法都有可能被别窃听到。而非对称式的加密方法有两个密钥,且其中的“公钥”是可以公开的,也就不怕别人知道,收件人解密时只要用自己的私钥即可以,这样就很好地避免了密钥的传输安全性问题。
    常见的非对称式加密技术:RSA、Elgamal、背包、Rabin、D-H、ECC算法。
    其中最常用的是RSA算法,单点登录采用的是JWT+RSA实现。

    第一种用法:公钥加密,私钥解密。—用于加解密
    第二种用法:私钥签名,公钥验签。—用于签名

    有点混乱,不要去硬记,总结一下:
    你只要想:
    既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;
    既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证。

    3、不可逆的加密技术

    加密后的数据是无法被解密的,无法根据密文推算出明文
    常见的不可逆的加密技术:MD5、SHA,HMAC

    MD5特点:
    1、不可逆运算:加密后不可以反计算得到明文
    2、等长性:加密后一定是32字符的长度 - 每个字符由四位二进制表示
    3、一致性:相同的明文加密得到的一定是相同的密文
    4、抗修改性:明文只要不相同,得到的密文区别就很大
    5、强抗碰性:两个不一样的明文,得到的密文一样概率非常小
    MD5流程:
    1、用户接收到服务端的加密的密钥Key - 用来进行拼接明文内容
    2、利用MD5算法进行计算Hash值,这值就是签名信息
    3、客户将明文内容跟签名信息一起发送给服务端
    4、服务端接收到用户的请求,则将明文内容计算hash值,验证hash值跟签名是否一致
    5、一致:说明是内容没有被更改的 。 不一致:说明内容被更改

    设计安全接口

  • 相关阅读:
    MySQL数据库简介+库表管理操作+数据库用户管理
    DDoS 攻击次数和流量峰值情况
    算法刷题介绍
    Nginx的安装
    SpringMVC学习笔记(十三)—— 注解配置SpringMVC
    java计算机毕业设计音乐网站MyBatis+系统+LW文档+源码+调试部署
    使用patch-package保存node_modules包修改
    力扣题解22-25
    《深入理解计算机系统》(2):虚拟内存
    SpringBoot概念、创建和运行及配置文件
  • 原文地址:https://blog.csdn.net/weixin_48412846/article/details/126280290