精华内容
下载资源
问答
  • 接口功能测试策略

    万次阅读 2012-04-18 15:30:07
    测试人员需要通过服务器接口功能测试来确保接口功能实现正确,那么其他测试人员进行客户端与服务器结合的系统测试过程中,就能够排除由于服务器接口缺陷所导致的客户端问题,便于开发人员定位问题。以下便是个人的...

    由于平台服务器是通过接口来与客户端交互数据提供各种服务,因此服务器测试工作首先需要进行的是接口测试工作。测试人员需要通过服务器接口功能测试来确保接口功能实现正确,那么其他测试人员进行客户端与服务器结合的系统测试过程中,就能够排除由于服务器接口缺陷所导致的客户端问题,便于开发人员定位问题。以下便是个人的平台服务器接口功能测试经验总结:

    一、接口测试范围

        根据服务器的测试需求,接口测试范围主要分为:1、新增接口的测试;2、新增业务功能接口测试;3、整个服务器的接口测试。所需测试测试接口依次增多,在测试时间足够的条件下,当然需要对所有接口进行测试用例的设计,但如果测试较短的情况下,则应该首先根据用户的典型操作对测试接口进行优先级划分,对调用频繁接口需要优先进行测试。

    二、接口测试策略

           在进行平台服务器接口测试之前,首先需要整理服务器接口的测试方案,分析接口测试的要点,平台服务器的接口测试内容主要有:

    接口设计检查

    接口用于服务器与客户端的数据交互,客户端通过网络协议传递的数据为服务器接口的输入数据,因此应该首先通过服务器接口文档及客户端数据约束文档进行交互数据的有效性检查:

    n  整数型数据位数

    n  浮点型数据精度

    n  字符串数据范围值

    要求客户端的整数型、浮点型、字符串数据以及其最大值和最小值都能作为服务器接口的有效输入。这些工作在服务器设计评审时就可以进行,以便确保不会出现客户端上传数据被服务器自动进行截断或四舍五入的操作。

    接口依赖关系检查

        以上策略只谈到单个接口的测试方法,对于用户来说,一个操作可能会造成服务器调用多个接口来进行完成,因此还需要从业务处理的角度,对各种业务操作所涉及的多个接口之间依赖调用进行测试。

        接口依赖关系检查主要是通过接口的输出值为另一接口的输入值来实现的,因此在进行接口测试之前,需要分析所测试接口的输入值是通过客户端还是其他接口输出来获取的,在设计测试用例时,加入接口的依赖关系说明以便于测试。

    接口输入/输出验证

    服务器接口功能测试类似于单元测试,在设计测试用例时,侧重点在于接口模块输入/输出项的正确性验证,根据接服务器接口处理方式,对各种接口进行分类:

    第一类:条件判断接口

           这类接口在接收到请求数据后,会根据输入参数进行条件判断,然后返回相应结果码,通常涉及条件判断的接口有:用户鉴权接口、升级状态上报、密码修改/重置等接口。因此输入/输出项验证的侧重点主要集中在:

    1)判断条件的验证

    要对判断条件进行验证,则需要知道接口是根据哪些输入项来进行判断的,以密码重置接口为例:

    密码重置接口

    『接口功能』:用户登录之后发起找回密码操作,用户输入邮箱信息后,游戏中心将向平台服务器发送请求,平台服务器将随机为用户生成新的密码,发到用户的邮箱中。

    『接口方向』:游戏中心—>平台服务器

    『遵循协议』:HTTPS,请求消息使用Post方式

    参数名称

    参数类型

    参数长度

    说明

    userID

    Int

    10

    用户ID号

    email

    String

    60

    邮箱地址

    key

    String

    50

    接口名称

    version

    String

    8

    版本号

    响应消息(sendMessageRes)

    参数名称

    参数类型

    参数长度

    说明

    resultCode

    Int

    5

    结果返回码,返回42000表示处理成功

    此接口根据输入的userID、email参数来进行数据正确性的判断(key是接口名称,如果错误服务器将不会处理,version是版本号,其值只是用于记录,不参与判断),设计接口测试用例时,应该首先对接口的判断参数进行验证,这些输入项不能为空,然后利用等价类划分、边界值方法来根据userID、email输入项设计各种合法的数据,验证接口是否可以正常处理。

    2)异常数据的响应

    只考虑正常情况,而不考虑异常场景是无法保证接口功能运行正常,对于密码重置接口,用户ID不存在、不合法,邮箱输入格式错误、用户邮箱信息不存在或未激活就是测试时需要考虑的异常场景,设计这类输入值,并且检查接口返回的响应码,响应码的正确才能保证客户端根据异常情况来显示相应的提示信息。简而言之,条件判断的接口其测试策略就是根据判断条件来设计各种输入值来检验接口的功能。

    第二类:数据查询接口

           这类接口接收到请求数据后,首先会验证请求是否合法,然后会根据请求项查询数据库相应表中数据返回给客户端,通常涉及数据查询的接口有:用户基本资料/经验值/赛事信息查询、游戏列表获取、在线人数查询等接口。以用户经验值查询接口为例:

    用户经验值查询接口

    『接口功能』:用户登录游戏中心后,可以查询自己每个游戏项目的经验值信息,包括此项目的经验值等级、等级称号、今日经验值上限等。

    『接口方向』:游戏中心—>平台服务器

    『遵循协议』:HTTP+XML,请求消息使用Post方式

    参数名称

    参数类型

    参数长度

    说明

    userID

    Int

    10

    用户ID号

    webkey

    String

    60

    当前分配给指定登录用户的密钥

    key

    String

    50

    接口名称

    version

    String

    8

    版本号

    isAll

    Int

    1

    是否查询用户所有的运动项目经验值 0:是;1否

    sportItemID

    String

    50

    运动项目ID,当isAll=1时不能为空,指定查询某个运动项目的经验

    响应消息(sendMessageRes)

    参数名称

    参数类型

    参数长度

    说明

    sportItemID

    String

    50

    运动项目ID

    sumExp

    Int

    11

    运动经验值总额

    expLevel

    Int

    3

    经验值等级

    minExp

    Int

    11

    本级最小经验值

    expOrder

    Int

    11

    经验值排名

    maxExp

    Int

    11

    本级最大经验值

    todayExp

    Int

    11

    今日获得经验值

    todayExpLimit

    Int

    11

    今日经验值上限

    designation

    String

    30

    称号(对应于经验值)

    winCount

    Int

    11

    胜利场次

    lossCount

    Int

    11

    失败场次

    isMaxExp

    Int

    1

    总经验值是否达到最大 0 否;1 是

    此接口首先会根据webkey来判断请求是否合法,然后根据请求参数中的userID、isAll、sportItemID来查询数据表中相应数据。除了象条件判断接口一样根据判断项webkey、请求参数userID、isAll、sportItemID设计合法/不合法和正常/异常测试值之外,还需要结合数据库来对查询结果进行验证:

    1)是否根据正确的关联数据表进行查询;

    2)验证查询结果是否从数据表中正确项中获取,涉及到多表联合查询时,不同表中的相同项设计不同测试数据进行验证;

    3)修改查询结果在数据表中对应项中的数据,使其为空值或客户端相应项的范围值的最大和最小值,查看接口输出是否正确。

    第三类:逻辑运算接口

           这类接口在收到请求数据之后,会进行一系列逻辑运算,然后根据处理结果更新数据库中的数据,通常涉及逻辑运算的接口有:比赛成绩同步、商品支付、各种数据报表等接口。以比赛成绩同步接口为例:

    比赛成绩同步接口

    『接口功能』:游戏服务器将用户每次的比赛成绩传给平台服务器,平台服务器根据用户的比赛成绩更新此用户的赛事排名,然后存入数据库。

    『接口方向』:游戏服务器—>平台服务器

    『遵循协议』:HTTPS+XML,请求消息使用Post方式

    参数名称

    参数类型

    参数长度

    说明

    userID

    Int

    10

    用户i-dong号

    webKey

    String

    64

    当前分配给指定登录用户的密钥

    key

    String

    50

    接口名称

    version

    String

    8

    版本号

    gymkanaCode

    String

    30

    当前比赛所参与的运动会,该参数为空说明只是普通用户的比赛

    sportItemID

    String

    50

    游戏项目的ID

    sportItemName

    String

    50

    游戏项目名称

    sportServerID

    String

    50

    游戏服务器IP

    matchSystem

    Int

    3

    竞速跑赛制:

    100米:1; 400米:2; 800米:4; 1500米:8; 4×100米:16;

    matchId

    String

    50

    该场次比赛唯一id

    record

    double

     

    当前用户成绩 (如record=8.123456)。非正常结束比赛时,即isWinner=3或4,如果是单人跑,isWinner=5,record=-1

    unit

    String

    20

    成绩单位

    isWinner

    Int

    2

    当前用户是否赢了0=输,1=赢,2=未完成,3=主动退出,4=被迫退出

    competitorID

    Int

    10

    对手idong号

    competitorRecord

    double

     

    当前对手成绩,规则同record

    competitorIsWinner

    int

    2

    对手输赢,规则同isWinner

    starttime

    String

    14

    开始时间(yyyy-MM-dd HH:mm:ss)

    endtime

    String

    14

    结束时间(yyyy-MM-dd HH:mm:ss)

    响应消息(sendMessageRes)

    参数名称

    参数类型

    参数长度

    说明

    resultCode

    Int

    5

    结果返回码,返回42000表示处理成功

    score

    Int

    11

    本次得分

    preRank

    Int

    11

    赛前积分在赛后的排名

    rank

    Int

    11

    积分排名

    upRankFlag

    Int

    1

    排名上升:1;排名不变:0;排名下降:-1

    isUpLevel

    Int

    1

    经验值是否升级 0 否;1 是

    exp

    Int

    11

    本次增加的经验值

    expLevel

    Int

    3

    经验值等级

    designation

    String

    30

    称号(对应于经验值)

    cPreRank

    Int

    11

    对手赛前积分在赛后的排名

    cRank

    Int

    11

    对手赛后积分排名

    cUpRankFlag

    Int

    1

    对手排名上升:1;排名不变:0;排名下降:-1

    encourageWord

    String

    15

    鼓励语句

        此接口比数据查询接口又更加复杂,除了用条件判断和数据查询类接口的策略对此接口进行测试用例设计之外,还需要验证对接口的算法规则进行检查,因为此接口涉及根据用户比赛成绩(record)进行排名然后返回其得分及排名情况(score、rank、upRankFlag、exp),通过对相关数据表中的数据进行查看方式,接口算法规则验证包括:

    1)用户胜利、失败、中途主动/被动退出、规定时间内未完成比赛情况下,此场比赛得分(scroe)是否正确;

    2)用户比赛成绩比上次成绩花费时间短、长、持平情况下,排名情况(upRankFlag)是否正确;

    3)用户比赛成绩处于第一名、最后一名、比上次成绩花费时间短/长/持平情况下,用户积分排名(rank)是否正确;

    4)用户胜利、失败、中途主动/被动退出、规定时间内未完成比赛,并且用户经验值在各种经验等级范围下,经验值根据得分进行计算的公式是否正确。

        逻辑运算接口由于还涉及插入或更新数据库操作,因此测试时还需要考虑数据库特性,如数据精度问题,在MySQL数据库中,如果是浮点型数据,存入时会有精度误差(131072.32插入float(10,2)类型的数据会变为131072.31),因此对于需要用于金额计算、数据统计、成绩比较的数据,最好使用定点型。

        最后服务器接口的测试如果有足够条件的话,还需要通过白盒测试来对接口代码做进一步的测试,通过编写关键代码的测试桩,可以有效查找将字符数组当成字符串使用造成的读越界这类不易通过黑盒测试发现的BUG。接下来的工作就是如何通过测试工具来执行服务器接口功能测试。

    展开全文
  • 秒杀功能接口设计

    千次阅读 2018-05-31 22:46:40
    最近在做秒杀的活动,期间发现了一些问题,特此做一些小结以供参考。具体的页面设计大致如下(本人大致勾勒了下,不是很正规): ...3、秒杀期间还要做好接口的限流功能,因为秒杀开始的那一刻,请求将骤增; 4、秒杀...

    最近在做秒杀的活动,期间发现了一些问题,特此做一些小结以供参考。具体的页面设计大致如下(本人大致勾勒了下,不是很正规):

    秒杀流程可大致划分如下:

     

    秒杀功能最主要的几点:

    1、被秒杀的商品库存绝对不能卖超,这点最关键;

    2、要特别注意防止秒杀活动被刷,不能出现商品都被同一个人用户秒杀的情况;

    3、秒杀期间还要做好接口的限流功能,因为秒杀开始的那一刻,请求将骤增;

    4、秒杀活动还未开始,防止恶意用户拿到秒杀地址来刷接口;

     

    针对以上几点来展开分析

    库存卖超?

    首先分析下库存会卖超的原因:

    1、并发时减商品库存的SQL未控制库存数量大于0;

    2、同一个用户可能会多次秒杀到多个商品;

    如上两点的解决方案是:

    1、减库存时控制库存数量

    UPDATE reward SET reward_count=reward_count-1 WHERE reward_id=?  AND reward_count > 0

    2、同一用户多次秒杀到同一商品,这里通过通过 中奖记录表中的reward_id和username构成的联合唯一索引

    UNIQUE INDEX rewardid_username(reward_id,user_name)

    这样当一个用户秒杀到多个同一商品时入库会失败,然后显示捕获异常即可.

    接口的限流?

    当秒杀活动开始后的一小段时间内,大量请求过来,将对服务器造成较大的负载,造成一系列连锁的效应,如数据库连接异常、超时,缓存被击穿等问题。针对这些潜在的点就要设计好接口的限流功能

    1、如果产品允许的话,秒杀的前端可以加上验证码校验来分散请求,防止机器人恶意刷单、暴力试探,但是我这里的项目中不允许使用(综合考虑产品设计以及活动场景、用户体验等因素),就像是12306中的验证码一样,可以很有效的拦截和分散相当一部分请求。验证码实现也很多,挑一款轻量级的就好了;

    2、后端的话,通过redis作为缓存,使用自定义注解+拦截器的方式实现限流,30秒内同一用户名或IP至多访问5次,超过5次的话,用户和ip加入黑名单(具体的限制需和产品讨论确定),并且返回请求太频繁响应。自定义注解+拦截器实现限流 请移步这里 ,获取用户请求的IP 请移步这里

    3、将后端秒杀的过程异步化,可一定程度上请求削峰,比如我做的活动中这个过程包括新增中奖记录、减库存、减抽奖机会、1年NBA会员充值等,只要你库存足够,用户秒杀就可以直接先返回秒杀成功,其余的这些处理过程可以留给异步化任务去完成。我这里就把1年NBA会员充值这个过程给放在ActivityMQ里面去了,其实这里要思考的点也很多,比如ActivityMQ里面的消息丢了怎么办? 有没有合适的重试机制?等等,这里就不再赘述了。实现异步化的方式也很多,比如java并发编程里的Executor框架(包含线程池、异步任务等)也是极好的,关于Executor框架(包含线程池、异步任务等),请移步这里

    4、为了减少与mysql数据库的交互,我把每个用户对应的抽奖机会放在了redis缓存中(考虑到这个秒杀活动上线时间不长),这个抽奖机会是用户购买了礼包后添加上去的,在用户支付成功后回调逻辑中给用户添加的秒杀机会,省的秒杀接口逻辑中去数据库中load用户的秒杀机会数。

    5、使用缓存后,要思考的点就更多了。经典的缓存击穿、雪崩、缓存和数据库双写一致性、并发竞争问题。缓存击穿和雪崩我们没考虑这种糟糕的场景,因为我们产品的日活跃量在3w+左右(我指的是活动落地页的日活跃量,不是普通的页面PV/UV之类的)。关于缓存和数据库双写一致性的问题,只能说,如果一定要100%保证数据的强一致性,那就不要使用缓存了,我们只能通过适当的缓存更新策略(比如更新数据库后及时删缓存、缓存更新可能失败,是否要建立补偿机制等)来降低数据不一致的概率。针对缓存key竞争读取问题,可以加分布式锁实现。关于这些点,我这里也没有纠结在缓存上,只要量没到那个级别,做的再多工作都是画蛇添足,如果上线后出现了问题,再针对具体问题对症下药,这里只是提一些要考虑的点。

     

    活动未开始秒杀接口就被刷了?

    由于现在的浏览器都支持查看源码,页面和js就暴露出来,自然包括秒杀接口的URL。针对这个问题,我们接口里明确限制了活动的开始和结束时间,比如活动时间是2018-05-05 09:00:00~2018-05-05 12:00:00,那么秒杀接口逻辑里除了限流和严格控制库存之外,就要判断请求进来的时间点是否落在活动的开始-结束时间之内,不是的话就直接返回错误响应了。

    注意事项:

    1、秒杀接口里面的逻辑中最好不要加锁去控制,加锁将严重影响秒杀接口的吞吐量,加锁后,锁的时间具有很大的不确定性,你不知道锁多久才会释放;

    2、写完接口后一定要模拟并发环境测试接口,我是用jmeter压测的。压测时要考虑活动页的活跃用户量,比如我的3w+,那你至少要用3w+的线程数去压测,而且最好用

    10台电脑,每台电脑的jmeter开3000个线程同时去压测,保证测试结果的正确性和真实性。可以写好jmeter的压测脚本后copy到其他电脑,但是整合10台电脑资源还是稍稍麻烦的。

    闲言:要真的有高手刷你的接口就比较尴尬了,毕竟你所有的防护措施只防君子不防小人。暂时就想到这么多了,有问题的话后续再补充更新。

    总结:

    1、尽可能的减少请求直接倒DB;

    2、某些逻辑异步化,提高吞吐率;

    3、尽可能的使用缓存;

    4、建立快速失败机制保证应用的可用性。


    books 引申阅读: 使用quartz实现高级定制化定时任务(包含管理界面)

    books 引申阅读: 秒杀功能架构设计分析

    展开全文
  • 接口测试工具Postman接口测试图文教程

    万次阅读 多人点赞 2018-07-11 13:10:03
    市场上有很多优秀的,完善的接口测试工具,比如SoapUI,Postman等,能够高效的帮助后端开发人员独立进行接口测试。这里使用Postman接口测试工具,此处以请求方式为POST的userLogin登录接口为例。

    目录

    一、前言

    二、Postman安装和使用

    三、请求方式

    四、资金记录接口实例演示


    一、前言

        在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正确性可用性。而这要求前端开发进度和后端进度保持基本一致,任何一方的进度跟不上,都无法及时完成功能模块的测试。
        做为后端开发人员,要求独立开发完成某个接口后,开发人员自己需要先测试通过后再提交给测试人员进行测试,否则会出现到测试人员哪里业务流程根本就走不通,或者BUG会过多的情况等。
        市场上有很多优秀的,完善的接口测试工具,比如SoapUI,Postman等,能够高效的帮助后端开发人员独立进行接口测试。这里使用Postman接口测试工具,此处以请求方式为POST的userLogin登录接口为例。

    二、Postman安装和使用

        1、这个直接去官网下载即可,我们使用免费版即可满足基本接口测试,根据个人或者公司的项目实际情况考虑是否需要专业版或者其他。
     
    免费版官网链接:https://www.getpostman.com/postman
    下载好的安装程序Postman-Win64-xxx-Setup.exe,双击安装即可。建议安装在非系统盘,即C盘在外的其他盘,另建议使用全英文路径,避免使用中文路径。
     
        2、打开Postman如下图2-1,可以关闭该页面跳过注册账户,非登陆状态下该工具可以直接使用。接下来出现引导页面,类似IDEA,Android Studio等开发工具的引导页。此处关闭即可。
    图2-1注册账户图
     
    图2-2项目创建引导图

    3、进入Postman主页面并创建项目接口集合

        这里是我之前用过,所以左侧文件栏存在几个已有的文件夹。
        选择功能菜单New下的Collection创建项目接口集合。新建一个亿的项目A hundred million,可在Description部分写一下项目描述。

    图2-3Postman主页面
     
    图2-4新建项目接口集合图

    4、创建项目模块文件夹

        一般项目会分多个管理模块或者功能模块进行开发。这里可根据项目具体情况创建子文件夹方便接口管理。此处在A hundred million项目右键创建资产管理assets文件夹、user用户管理文件夹。可将测试的接口实例保存在对于管理模块下。

    图2-5新建资产管理文件夹

    5、后台登录接口演示

        开发完成后台接口,编写正确严谨的逻辑代码处理前端请求。此处登录接口代码如下,运行后台开发项目,使该接口能够访问。接口请求路径为:http://localhost:8080/manage/app/user/login

    @Controller
    @RequestMapping("/manage/app/")
    @Scope("prototype")
    public class AppUserController {
    
       /**
        * 日志
        */
    public static Logger customFile = LoggerFactory.getLogger("manageCustomFile");
    
    @Resource
    private AppUserService appUserService;
    
        /**
         * 用户登录
         * @param baseResult
         * @return
         */
        @RequestMapping(value = "user/login" , produces = "application/json;charset=UTF-8", method = RequestMethod.POST)
        @ResponseBody
        public BaseResult loginUser(@RequestBody BaseResult baseResult) {
            customFile.info("appId:"+ baseResult.getTreasureID()+ "用户登陆访问:" + baseResult.toString());
            return appUserService.loginUser(baseResult);
        }
    }

    6、新建接口测试

        在Postman主页面Content部分点击'+'按钮,新增一个接口测试。在图2-6所示第一部分填写接口请求路径,左侧下拉列表可选择请求方式,此处选择POST请求方式。接口请求路径为http://localhost:8080/manage/app/user/login。第二部分是请求体,即包含接口所需请求参数的Body,此处选择原始数据RAW,数据类型使用JSON数据作为请求数据。点击蓝色Send按钮发送请求,后台项目接口接收请求并响应返回执行结果。此处后台处理数据返回结果仍是JSON数据,这个看实际项目而定,此处仅做演示。第三部分是接口响应体,即接口响应请求处理并返回的数据。点击Pretty自动匹配接口返回的数据格式并对数据美化显示,使数据看起来更加直观。如果接口测试出现异常,则可以通过PreView视图查看浏览器响应接口的页面信息,也可以通过Header了解请求状态等参数。一般出现异常还是直接去后台看控制台的异常信息及项目日志来处理解决异常,再进行接口测试。

    图2-6接口测试图

        接口测试通过后,可Ctrl+S保存接口测试实例,填写接口测试名称和接口描述信息,选择要保存的路径,此处保存在user用户管理模块文件夹。当项目的接口全部测试通过后,可在A hundred million项目右键Export导出接口文档,保存为JSON接口测试文件,该文件可通过Postman导入查看。

    三、请求方式

        对于后台开发的接口,请求方式肯定不止POST一种,Postman也支持多种请求方式。在新建接口测试实例时可选择接口的请求方式,如图3-1。

    图3-1接口请求方式图

        请求类型可以模拟Form表单文本提交,Form表单文件提交,raw原始数据提交,二进制文件提交。对于原始数据类型raw还支持不同文件格式,包括JSON,TXT,HTML等多种文件格式。

    图3-2数据请求类型图

     

    四、资金记录接口实例演示

        后台开发接口如下,服务器部署运行后台项目。接口请求路径为:http://localhost:8080/manage/app/user/asset/withdrawRecord

    @Controller
    @RequestMapping("/manage/app/")
    @Scope("prototype")
    public class AppUserAssetController {
     
        /**
         * 日志
         */
        public static Logger customFile = LoggerFactory.getLogger("manageCustomFile");
    
        @Resource
        private AppUserAssetService appUserAssetService;
        
        /**
         * 获取提现记录
         * 即我的页面中的资金记录
         * @param baseResult
         * @return
         */
        @RequestMapping(value = "user/asset/withdrawRecord" , produces = "application/json;charset=UTF-8", method = RequestMethod.POST)
        @ResponseBody
        public BaseResult getUserWithdrawRecord(@RequestBody BaseResult baseResult){
            customFile.info( "appId:"+ baseResult.getTreasureID() + "用户提现记录获取"+baseResult.toString());
            return appUserAssetService.getUserWithdrawRecord(baseResult);
        }
    }

    新建资金接口测试
    请求方式为POST,
    请求URL为http://localhost:8080/manage/app/user/asset/withdrawRecord
    请求体为JSON类型的原始数据
    点击Send请求接口,接口响应请求处理返回结果如图3-3所示


    图3-3资金记录接口测试图
     
    展开全文
  • 接口鉴权功能的实现

    千次阅读 2019-12-10 21:28:29
    但是如果服务提供给别的部门使用之后,在不了解对方的使用场景,接口调用QPS等,如果对方接口调用量过大,会影响整个使用该服务的调用方,且对接口的安全性也会有风险。在这种情况下,每个微服务都需要对调用者进行...

    一、背景

    随着系统的发展,单体应用逐渐演化成微服务架构。系统微服务化之后,若干个微服务之间会有调用。同个部门内实现的服务会被内部调用,一般风险是可控的。但是如果服务提供给别的部门使用之后,在不了解对方的使用场景,接口调用QPS等,如果对方接口调用量过大,会影响整个使用该服务的调用方,且对接口的安全性也会有风险。在这种情况下,每个微服务都需要对调用者进行鉴权。

    基本的鉴权维度有:

    • 应用鉴权:对方在调用我方服务某个接口的时候,需要将对方的用户标识,如appKey,传过来。我方看此appKey是否有授权调用的权限,没有直接返回失败;有授权即可正常返回结果;
    • 接口鉴权:更细粒度的鉴权,在应用鉴权通过之后,还需要对某个接口进行鉴权。如:团队A想要调用订单服务,我们只想开发订单查询接口的权限,而涉及到订单退款等操作类的接口可拒绝对方访问。常见的接口鉴权有RPC接口之间的调用鉴权和HTTP接口调用鉴权。

    二、需求分析

    1、基本实现方案

    首先,我们能想到的最基本的实现方案:

    • 调用方申请访问权限,服务方授权之后会生成调用方对应的密码,存储到DB/缓存等具有存储功能的组件中,appKey <—> password
    • 调用方在调用接口时,需要将appKey和password一起当做参数传过来;
    • 服务方在收到请求之后取出请求中的参数appKey和密码password,根据apppKey从DB/缓存等获取对应密码,判断服务方存储的密码与对方传过来的密码是否一致,不一致则拒绝访问。

    2、重放攻击

    上述流程是最简单的实现,但是存在重放攻击的风险。

    重放攻击是指:

    重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何网络通过程中都可能发生,是计算机世界黑客常用的攻击方式之一。

    注:来源于百度百科

    通俗点解释:攻击者利用网络监听或其他方式截取A发送给B的报文,并把由A加密的报文发送给B,使B误以为入侵者就是A,然后主机B向伪装成A的攻击者发送应当发送给A的报文。

    3、优化方式

    (1)优化方式一:数据加密

    调用方将调用方身份信息和密码通过明文的方式传递过来,这个过程会被第三方截取获取到appKey和password,第三方可以根据获取到的信息伪装成已认证的调用方去调用服务方服务获取接口信息,对服务方服务的稳定性、安全性造成威胁。这就是“重放攻击”。

    解决办法:

    对数据进行加密。

    • 调用方将调用的接口名 + appKey + 密码 拼在一起,通过加密算法对其加密生成一个token值,然后再将token值拼接在原调用的url后发送至服务方,如:http://localhost:8080/user?getUserInfo?userId=1234&appKey=abc&token=dasadjij21oijiooodsadaodjaosnd

    • 服务方接收到调用方发送的请求后,解析获取到appKey、token值,根据appKey从服务方存储地获取到对应password值,然后用同样的加密算法生成服务端的token值:token_s,用token_s与调用方的token值进行比较,相同,则允许访问;不相同,则拒绝访问。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bfnGoFyi-1575984360956)(/Users/wanggenshen/Library/Application%20Support/typora-user-images/image-20191204113153975.png)]

    (图片来源:极客时间https://time.geekbang.org/column/article/171760)

    (2)优化方式二:数据加密 + 随机数

    上述方式对于安全性要求不高的内部系统已经绰绰有余。但是这种设计仍然存在重放攻击的风险:由于生成的token值是固定的,攻击者可以花费一定的时间去破解。所以需要继续优化token生成算法,生成动态token来避免这种风险。

    解决办法:

    为了生成动态的token,引入一个随机数,在加密的时候也对随机数进行加密,这样每次生成的token就是动态变化的。一般使用时间戳作为随机数,使用时间戳作为随机数的好处是:接收方解析到时间戳后还可以验证token是否过期,比如时间戳是一年之前对应的时间戳,自然不允许访问;

    • 调用方对 url + appKey + 密码 + 时间戳 进行加密,生成一动态token,拼接在url后,同时拼接上时间戳,发送给服务方;

    • 服务方接收到请求之后,

      • 首先解析出 appKey、密码、时间戳、token;

      • 再校验时间戳是否在时间窗口内,比如1小时;校验不通过则认为token过期直接拒绝访问,通过进入下一步;

      • 然后根据appKey去查询对应的passwrod_s,使用相同的加密算法对

        url + appKey + passwrod_s + 时间戳 进行加密生成新token_s,比较

        token 和 token_s:相同,允许访问;不相同;拒绝访问;

    示意图如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xV425cOz-1575984360957)(/Users/wanggenshen/Library/Application%20Support/typora-user-images/image-20191204135912522.png)]

    (图片来源:极客时间https://time.geekbang.org/column/article/171760)

    4、时序图

    上述时序图如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jErD4PQb-1575984360959)(/Users/wanggenshen/Library/Application%20Support/typora-user-images/image-20191210212456359.png)]

    三、代码实战

    上述方式得到的功能点列表如下:

    • (1)把 URL、appKey、密码、时间戳拼接为一个字符串;
    • (2)对字符串通过加密算法加密生成 token;
    • (3)将 token、appKey、时间戳拼接到 URL 中,形成新的 URL;
    • (4)解析 URL,得到 token、appKey、时间戳等信息;
    • (5)从存储中取出 appKey 和对应的密码;
    • (6)根据时间戳判断 token 是否过期失效;
    • (7)验证两个 token 是否匹配;

    经过分析可知,设计3个功能:

    • Url操作相关,包括Url拼接参数和解析Url;
    • Token操作相关,包括token生成、判断token过期、判断token是否匹配;
    • appKey存储和查询;

    所以按领域模型划分,总共有3个模型,对应3个类,如下:

    (1)Url不仅包括HTTP接口url请求,也有RPC接口请求,因此抽象封装成ApiRequest类:

    (2)Token类设计:

    AuthToken

    (3)AppKey查询,为了抽象,提供接口:

    (4)定义好领域模型的设计之后,需要将这些类组装起来并提供入口:

    public interface ApiAuthencator {
        void auth(String url);
        void auth(ApiRequest apiRequest);
    }
    

    (5)测试

    为了更好的测试效果,提供了InvokerController类,来模拟客户端调用时token生成、拼接url、触发服务端鉴权等动作。

    完整代码见:完整代码


    参考:极客时间《设计模式之美》

    展开全文
  • unittest实现HTTP接口功能测试

    千次阅读 2016-07-26 14:56:07
    实际上H5页面接口测试与传统的接口测试的基本思路是一致的,就是通过数据准备(包括正常和异常的参数)、接口调用、结果观察这三个流程来验证接口功能逻辑符合预期,并且对于未预期的异常情况有较好的容错性和鲁棒...
  • 十分钟搞定接口功能测试

    千次阅读 2018-10-17 18:46:26
    如果你和我一样菜,请快速看一下如何快速测试接口! ================== 1 安装python环境,这里请大家百度! 2 下载python模块:链接: https://pan.baidu.com/s/1hsByrdE 密码: 4gya 3 将模块解压后放到D:\Python\...
  • VOLTE网络架构、接口功能实体

    万次阅读 2016-10-27 15:49:14
    一、 VOLTE网络架构 VOLT网络架构有很多种,协议中...功能接口名称 接口类型 连接网元 承载协议 分组域 S1-MME 信令 MME-eNodeB GTP-C S1-U 数据 SAE GW-eNodeB GT
  • Soapui接口功能测试数据传递

    千次阅读 2017-06-10 22:22:14
    接口间的数据依赖,A接口请求的参数需要用到B接口的返回值接口请求通常要用到鉴权的接口获取Token,Token通常会跟其他接口构成一对多的关系,这种情况下我们可以把Token的接口做成一个公共的TestCase,供其他的...
  • 接口功能及意义

    千次阅读 2018-03-09 17:23:45
    转自:...KFC就是接口,我们看到了这个接口,就知道这个店会卖炸鸡腿(实现接口)。那么为神马我们要去定义一个接口涅,这个店可以直接卖炸鸡腿啊(直接写实现方...
  • Unittest实现H5页面接口功能测试

    千次阅读 2016-10-21 18:23:28
    目前主流的H5页面动态获取内容的方式是采用ajax异步请求后台数据实现实时刷新,实际上就是用GET/POST的HTTP请求后台接口,再将返回的数据(一般是json或xml格式)渲染在页面上,因此保证H5页面接口功能正确性就...
  • OTG接口设备主从功能是如何实现的

    千次阅读 2016-11-02 20:05:15
    USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG)。USB OTG技术可实现没有主机时设备与设备之间的数据传输。例如:数码相机可以...
  • 什么是接口测试?怎样做接口测试?

    万次阅读 多人点赞 2018-08-20 11:17:31
    1.什么是接口? 2.接口都有哪些类型? 3.接口的本质是什么? 4.什么是接口测试? 5.问什么要做接口测试? 6.怎样做接口测试? 7.接口测测试点是什么? 8.接口测试都要掌握哪些知识? 9.其他相关知识? 1....
  • JAVA基础——接口(全网最详细教程)

    万次阅读 多人点赞 2018-05-10 09:46:42
    官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 我的解释:接口...
  • 实例: ...关键字:微信公众平台 微接口 接口100 API...在本文中,我们列出微信公众平台上可以使用的API接口以及举例如何在微信公众平台调用这些接口实现相应的功能接口调用说明: ① Appkey请使用的微信公
  • 订单支付功能对接支付宝支付接口

    千次阅读 2017-10-30 16:34:12
    求助:这张GIF的效果动图整了一个多小时...蚂蚁金服开放平台专门为开发者的网站,包含了支付宝中涉及的很多功能接口,本文的功能实现是在沙箱环境中进行,蚂蚁沙箱环境(Beta)是协助开发者进行接口功能开发及主要功能联
  • 先了解一下Fiddler Everywhere的基本用法,然后再看一下它的AutoResponder功能。AutoResponder主要用来mock接口的数据,在web调试的时候非常方便...
  • js实现百度搜索接口及链接功能

    千次阅读 2016-09-22 21:55:33
    js实现百度搜索接口及链接功能 anchor *{ margin:0; padding:0; } #wei{ width:500px; height:600px; margin:0 auto; border:0px solid gray; } #wei input{ ...
  • 接口测试和功能测试的区别

    千次阅读 2018-06-29 11:07:00
    接口测试和功能测试的区别 接口测试和功能测试的区别: 本文主要分为两个部分:  第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者之前的区别与联系。但该...
  • 短信验证码接口示例,如何接入短信API接口实现短信自动发送功能; 网站如何实现自动发送短信验证码的功能,短信验证码技术文档需要哪些参数,网站点击触发验证码的功能实现的方法,通过调用API接口的方式实现短信...
  • I/O接口的基本功能

    万次阅读 2018-06-27 14:58:09
    I/O接口的基本功能: (1)地址译码,选取接口寄存器 (2)接收控制命令,提供工作状态信息 (3)数据缓冲(速度匹配),格式转换 (4)控制逻辑,如中断、DMA控制逻辑、设备操作等。...
  • java 8功能接口(Functional)

    千次阅读 2016-09-19 11:34:55
    Ø JDK1.8包括了许多功能接口。它们中的一些是老版本中被熟知的接口,例如Comparator和Runnable。这些已存在的接口已经通过@FunctionalInterface注解扩展为支持Lambda表达式。   Ø 在 Java 中,Marker(标记)...
  • 各位大大,你们好。 最近小弟需要做一个银联支付的接口...请问一下,这两个接口能否实现直接转账的功能? 我作为一个商户,不是客户打款给我,而是我转账给客户。 各位大大不知道有没有做过类似的功能,请多多指教
  • 物理层的功能是什么?物理层的接口规定了哪些特性? :功能:实现物理上互连系统间的信息传输,涉及通信在信道上传输的原始比特流;...物理层接口特性有:机械特性、电气特性、功能特性、规程特性
  • 这个是类似微服务化架构的服务注册和服务发现来实现的功能体对外暴露的接口,这种接口只针对于单个功能体,相关功能体通过服务化接口向外与其他的功能体进行交互,而其他的功能体通过该功能体暴露的接口与此功能体...
  • 微信自定义菜单接口功能介绍,微信5.0开启全民打飞机首列~~ 更多飞机尽请期待!
  • 下载文件功能(前端调用后台接口实现) 接口没有设置相关的token(有些接口设计中需要在请求头中设置headers: { ‘Content-Type’: ‘application/json;charset=utf-8’, Authorization: token, }) // get请求最...
  • 第—条 《远程医疗咨询系统接口功能规范》是指医院信息系统与远程医疗咨询系统本地端的接口程序。其主要任务是保证远程医疗咨询系统所需的信息能及时、迅速的从医院信息系统中直接产生并读取,最大限度的避免信息的...
  • 上篇介绍了淘宝开放的API接口,根据功能说明,我们对几个接口进行测试,其他的接口,可以照猫画虎。点击任意接口,在功能描述页面,调用级别apiType,apitype分别有三个值: apiType=1,调用时需要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,261,784
精华内容 904,713
关键字:

属于接口功能的是