版权声明:有问题欢迎留言,转载请声明出处 https://blog.csdn.net/larger5/article/details/85939068
一、前言
① 上线产品
② 涉及会员时长充值
③ …
这时候,权限安全就显得十分重要了,下面是公司定制的一套高可用的安全机制 v1.0
有空更新笔者的 SpringBoot 的实现代码。
二、接口安全
接口安全一般分三部分:调用方身份令牌token(验身份)、参数签名sign(防篡改)、时效性timestamp(防Doss攻击)
一、生成规则:
- Token:用户登录时,服务器为该用户生成身份令牌token、用于刷新token的refresh_token。token有效时间为1天,refresh_token有效时间为一个月。
在使用过程中,所有接口都需要带该token。当token过期时,使用refresh_token获取新的token。当refresh_token也过期时,重新登录授权
refresh_token的作用是,代替先前获取token的手机号、openid、密码等敏感参数。
- Sign: APP请求接口时附加在url上的参数。sign = (appkey+url+所有参数按照参数名字母升序排列后键值对拼接+timestamp+appkey)
其中,参数的拼接不包括“=、&”等特殊符号,url字段主要作用在于签名RestFul接口。
例如:接口为“http://api.acb.com/def/efg
”,参数为“key1=value1&key2=value2
”,则sign=md5(appkey+http://api.acb.com/def/efg+key1+value1+key2+value2+timestamp+appkey)
,注意明文拼接顺序,sign的作用是保护参数,可以只对关键参数签名。
服务端收到请求时,验证该sign是否正确,若不正确,表明数据被篡改。
- timstamp:服务端收到请求时,如果该时间与此时的系统时间相差很大,表示该次请求无效。
ex:https://xxxapis.xxx.com/userInfo/insertUserInfoByMobile?sign=7cbda029c0b481593ef4f1ac9be8e6c2&mobile=15111111111×tamp=1570000000001
二、使用流程:
- 给每套产品,分配一个独立的appkey。(如:app_lin3hong5cun4)
- 获取token:用户登录时,服务端接收手机号、或第三方Openid,根据token = md5(Appkey+手机号/Openid+timestamp)计算token。
将键值对token-user_id存于Redis,并设置该键的生存时间(如:1天) - 接口检验:
(1)用户验证:使用token查redis。若token存在表明安全,将键值中的user_id用于查询业务。若token不存在,则是伪装用户,或者过期token。返回错误码,重新获取token
(2)签名验证:使用规则计算sign,若与接口返回的sign一致,表示参数安全,可以继续执行业务。若不一致,表示参数被改,该次请求无效,返回错误码。
(3)验证时效性:若接口中的timestamp与系统时间相差太大,可能是攻击,直接返回错误码。
三、返回码
1、普适码
返回码 | 描述 |
---|---|
200 | 成功 |
400 | 失败,未知错误 |
2、授权/令牌返回码
返回码 | 描述 |
---|---|
10000 | 非法请求参数 |
10001 | 无权限访问 |
10002 | token过期 |
10003 | refresh_token过期 |
10004 | sign 无效 |
10004 | app_key无效 |
10006 | timestamp参数无效 |
10007 | 访问IP不合法 |