🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 获取token的几个参数概念 获取token一般会涉及到几个参数`appid`,`appkey`,`timestamp`,`nonce`,`sign`。我们通过以上几个参数来获取调用系统的凭证。 * `appid`和`appkey`可以直接通过平台线上申请,也可以线下直接颁发。`appid`是全局唯一的,每个`appid`将对应调用方,`appkey`需要高度保密。 * `timestamp`是时间戳。时间戳的目的就是为了减轻DOS攻击。防止请求被拦截后一直尝试请求接口。服务器端设置时间戳阀值,如果请求时间戳和服务器时间超过阀值,则响应失败。 * `nonce`是随机值。随机值主要是为了增加`sign`的多变性,也可以保护接口的幂等性,相邻的两次请求`nonce`不允许重复,如果重复则认为是重复提交,响应失败。 * `sign`是参数签名,将`appkey`,`timestamp`,`nonce`拼接起来进行md5加密(当然使用其他方式进行不可逆加密也没问题)。 * `token`,使用参数`appid`,`timestamp`,`nonce`,`sign`来获取token,作为系统调用的唯一凭证。`token`可以设置一次有效(这样安全性更高),也可以设置时效性,这里推荐设置时效性。如果一次有效的话这个接口的请求频率可能会很高。`token`推荐加到请求头上,这样可以跟业务参数完全区分开来。 ## 身份验证 * 用户登录向服务器提供认证信息(如账号和密码),服务器验证成功后返回Token给客户端; * 客户端将Token保存在本地,后续发起请求时,携带此Token; * 服务器检查Token的有效性,有效则放行,无效(Token错误或过期)则拒绝。 * 安全隐患:Token被劫持,伪造请求和篡改参数。 ## Token+AppKey签名验证 与上面开发平台的验证方式类似,为客户端分配AppKey(密钥,用于接口加密,不参与传输),将AppKey和所有请求参数组合成源串,根据签名算法生成签名值,发送请求时将签名值一起发送给服务器验证。 这样,即使Token被劫持,对方不知道AppKey和签名算法,就无法伪造请求和篡改参数。再结合上述的重发攻击解决方案,即使请求参数被劫持也无法伪造二次重复请求。 登录退出过程: ![](https://img.kancloud.cn/04/d2/04d2e04aa796d570cfa4716122e9dd40_800x402.png) 后续请求: ![](https://img.kancloud.cn/02/80/028041e6e9270b4b9e2951bc77b1d2e7_600x818.png)