前言
APP和后端进行交互的时候,我们都是需要考虑数据的安全性。APP想后端发起一个请求(http/https),如果别人知道这个请求的url,那如果我直接放在浏览器上请求,能不能获取到数据?
在这里我们就需要对api进行一个认证。不是什么地方的请求的都是能请求到数据的,我们只让符合我们规则的请求获取到相应的数据。
当然这种认证方式有很多,有非常简单的,也有非常复杂的。这里介绍一种相对简单并且轻量的API认证方式。
认证方式
服务端生成 App-Key
和 App-Secret
,并给到前端。
前端每次发起请求都需要在请求头中带以下四个HTTP Request Header,具体如下:
名称 | 类型 | 说明 |
---|---|---|
App-Key | string | 应用密钥 |
App-Nonce | string | 随机数:位数前端自定义 |
App-Timestamp | string | 时间戳 |
App-Signature | string | 数据签名 |
App-Signature
生成方式:SHA1(App-Secret
+ App-Nonce
+ App-Timestamp
);
即将App-Secret
、App-Nonce
和App-Timestamp
这三个字符串按先后顺序(也可以是其他顺序)进行SHA1摘要算法的加密。
服务端从请求头中获取相应的数据:
- 验证
App-Key
的准确性。 - 根据规则也生成一个
Signature
,用后端生成的和前端传输过来的相比较,如果一致就表示认证通过。
在传输过程中,这些数据都是能被外界获取的,但是App-Secret
是没有在传输过程当中的。
总结
这种方式只能说在某种程度上防止了API被乱调用,如果抓包或者稍微懂点技术的人,还是很容易攻击的。但是如果我加上https,再加上双向认证,这样就很安全了。
以上只是一种简单的方案,如果你有其他更简单更安全的方案,欢迎指教。