• restassured|接口加解密实战


    一、需求背景

    在现在的项目架构中,经常会对接口进行加解密的需求,来加强安全性,特别是金融行业更是如此,如银行。那么,假如我们也是采用的restassured来封装apiobject,但是又不想破坏原来的结构,那又如何来实现呢。

    二、解决方案

    restassurde的filter

    1、filter机制

      A filter req -> B filter req -> C filter req -> send -> A filter res -> B filter res -> C filter res

    三、事前准备

    1、使用python搭建本地建议局域网

    具体请查阅

    2、原始的json报文(企业微信部门查询接口的样例)

    {
       "errcode": 0,
       "errmsg": "ok",
       "department": [
           {
               "id": 2,
               "name": "广州研发中心",
               "name_en": "RDGZ",
               "parentid": 1,
               "order": 10
           },
           {
               "id": 3,
               "name": "邮箱产品部",
               "name_en": "mail",
               "parentid": 2,
               "order": 40
           }
       ]
    }

    3、经过base64加密之后的报文

    ewoJImVycmNvZGUiOiAwLAoJImVycm1zZyI6ICJvayIsCgkiZGVwYXJ0bWVudCI6IFt7CgkJCSJpZCI6IDIsCgkJCSJuYW1lIjogIuW5v+W3nueglOWPkeS4reW/gyIsCgkJCSJuYW1lX2VuIjogIlJER1oiLAoJCQkicGFyZW50aWQiOiAxLAoJCQkib3JkZXIiOiAxMAoJCX0sCgkJewoJCQkiaWQiOiAzLAoJCQkibmFtZSI6ICLpgq7nrrHkuqflk4Hpg6giLAoJCQkibmFtZV9lbiI6ICJtYWlsIiwKCQkJInBhcmVudGlkIjogMiwKCQkJIm9yZGVyIjogNDAKCQl9CgldCn0=

    四、示例

    1、原始无加密的返回报文测试用例  

        @Test
        void raw(){
            Response response  = given()
                    .log ().all ()
                    .contentType ( ContentType.JSON)
                    .get ("http://127.0.0.1:8888/row.json")
                    .then ()
                    .log ().all ()
                    .extract ()
                    .response ();
    
            assertEquals("广州研发中心",response.path ( "department.name[0]" ).toString ());

    2、经过base64加密之后返回的测试用例

        @Test
        void encode(){
            Response response  = given()
                    .filter ( (req,res,ctx)->{
                        //返回的Response不具备set方法,无法修改body
                        Response originResponse = ctx.next ( req,res );
                        //ResponseBuilder的作用主要是在Response的基础上建设出来一个新的可以修改body的对象
                        ResponseBuilder responseBuilder = new ResponseBuilder ().clone ( originResponse );
                        //解密过程
                        String encodeBody = originResponse.getBody ().asString ();
                        byte[] decodeBody = Base64.getDecoder ( ).decode ( encodeBody );
                        responseBuilder.setBody ( new String ( decodeBody ) );
                        //ResponseBuilder在最后通过build方法直接创建一个用于返回的不可修改的Response
                        Response responseNew = responseBuilder.build ();
                        return responseNew;
                    } )
                    .log ().all ()
                    .contentType ( ContentType.JSON)
                    .get ("http://127.0.0.1:8888/encode.json")
                    .then ()
                    .log ().all ()
                    .extract ()
                    .response ();
    
            assertEquals("广州研发中心",response.path ( "department.name[0]" ).toString ());
    
        }

    测试结果:

    五、filter全局设计

    待处理

    六、总结

    restassured的filter作用很大,还需我们去仔细研究。这里的是不破坏原来的请求结构来对加密的报文解密,并且后面是对json格式的报文断言,那么有一个启发,可以使用filter机制,对非json格式(如xml,或者是二进制文件),只要是使用http协议,都可以转换成json格式,最后统一为json格式断言

    restassured的filter机制官网:

    https://github.com/rest-assured/rest-assured/wiki/Usage#filters

    知道、想到、做到、得到
  • 相关阅读:
    [PHP] Which function can be used to format a local timestamp according to a specific locale?
    [Yii Framework] yii 如何使用第三方插件
    [PHP] Header to out put the image file.
    [PHP] PHP 格式化日期 format the datetime in PHP
    VC6工程中的文件类型
    VC6++ output :error executing c:\windows\system32\cmd.exe.
    根据选择计算Mask值
    .NET垃圾收集关键方法解析(转)
    JS访问表格的每行的每个TD的方法
    HTTP 状态消息详解
  • 原文地址:https://www.cnblogs.com/Durant0420/p/15008927.html
Copyright © 2020-2023  润新知