当前位置: 首页 > 后端技术 > Java

Java培训:如何写一个优秀的对外接口

时间:2023-04-02 01:40:51 Java

以下文章来自Java知音安全一、创建appid、appkey和appsecretappid:应用的唯一标识appkey:公钥=账号appsecret:私钥=密码1.设计一个认证系统,专门为第三方接入应用创建账户信息生成appid、appkey和appsecret,然后将appkey和appsecret发送给第三方接入应用进行认证ps:appkey和appsecret是成对出现的目的机制是第一次验证(类似登录场景),申请token,然后请求数据请求,直接带上token请求服务端认证即可。2.第三方接入应用自注册需要验证企业信息的合法性(暂不考虑)2.Token:token(过期)1.第三方接入应用首先获取appkey和appsecretstep2.Request认证系统获取nonce随机数,服务器将nonce3存储在缓存中。client得到随机数后,与appsecret拼接生成appsecretStr,然后调用生成签名的方法,传入appsecretStr,appkey,nonce,url(注意:可以转成大写,小写,追加特殊字符,然后加密)进行不可逆加密(MD5/SHA1等)生成签名A。然后构造请求,将签名放在请求头signature中,post请求体中放入参数:appkey,nonce,timestamp,url根据request.getRequestURI()获取,认证接口调用_java训练4.认证系统获取request后,根据appkey查询缓存中的nonce,判断是否存在.如果不存在,则提示非法请求;如果相等,则为恶意请求。判断timestamp的时效性,防止恶意请求:数据包中的clienttimestamp字段,然后用server当前时间减去client时间,看结果是否在一个范围内。先根据appkey查询数据库,判断是否存在。如果不存在,则提示非法用户;否则,找出appsecret,按照客户端的签名加密方式加密,生成签名B,比较A和B,如果相同则生成token。使缓存中的随机数无效并返回令牌。3、POST请求4、客户端IP白名单(可选)5、单个接口限流IP(令牌桶限流、漏桶限流、计数器限流)。限流是为了更好的保持系统稳定性。使用redis统计接口调用次数,ip+接口地址为key,访问次数为value,每次请求value+1,设置过期时间限制接口调用频率6、记录接口请求日志使用aopglobal记录请求日志,快速定位找到异常请求的位置,排查问题原因。7、采用Https1,在服务器端配置SSL证书2、客户端调用https工具类,忽略服务器证书验证8、数据有效性验证9、密码查询(添加缓存,key使用客户编号)1、更新密码时,Updateredis;2.找不到缓存,检查数据库,同时更新缓存;3、密码需要在缓存和数据库中加密,返回时解密(或者返回给客户端时由客户端解密)10、接口调用失败告警11、高可用:服务器集群部署(2-3)客户端重试机制12.更改轨道,保存上次密码?13、查询密码和交易密码是否有两个独立的密码?幂等性幂等性是指任意多个请求的执行结果与一个请求的执行结果具有相同的影响。说白了就是查询操作无论查询多少次都不会影响数据本身,所以查询操作本身是幂等的。但是对于新的操作,每次执行都会改变数据库,所以是非幂等的。解决幂等问题的方法有很多种,这里介绍一种比较严谨的方法。提供生成随机数的接口,随机数是全局唯一的。调用接口时带上随机数。第一次调用,业务处理成功后,以随机数为key,以运算结果为value,存入redis,同时设置过期时间。第二个调用是查询redis。如果key存在,则证明是重复提交,直接返回错误。数据规范版本管控一套成熟的API文档,一旦发布,不得随意修改接口。这时候如果要增加或者修改一个接口,就需要增加版本控制。版本号可以是整数类型,也可以是浮点数类型。一般接口地址会带版本号,http://ip:port//v1/list。响应状态码规范统一响应数据格式为了方便响应客户端,响应数据会包含三个属性,状态码(code)、信息描述(message)、响应数据(data)。客户端可以根据状态码和信息描述快速获知接口,如果状态码返回成功,则开始处理数据。响应结果定义及常用方法: