声明一点,我没做过过任何商业APP,以下想法仅仅是个人业余时间的一点思考,若你是专业人员,不吝赐教。
概述
微信开发过程中,会使用到微信服务器提供的API,这些API都是基于HTTP协议调用的,为什么我们自己的APP服务器不采用这种方式呢?
这种方式最直观的好处就是,API设计得足够好时,服务器只需要开发一次,无论前端是 WEB,APP ,APK…都通过http调用API请求数据并响应。
这种方式类似于传统C/S模型的开发,服务端/客户端定义相同序列的数据结构(称之为通信协议),差别在于现在用http协议,数据类型由之前的二进制流变成文本(XML/JSON)格式。
这篇文章主要介绍,在这种模式下的开发过程及安全性上的思考。
登录过程
基于HTTP的APP会遇到服务器无状态问题,比如客户端发起API调用:GetUserInfo,,服务器如何判断这个用户是谁?
最先想到的就是,每一个API调用都带上用户的用户名和密码,这种方法确实太笨。
这里提供一个思路是:服务器保存很多带有锁的盒子,盒子里存储用户信息,用户登录成功之后,获得一把钥匙,以后的用户请求就只需要提供这把钥匙,简单过程如下:
1、用户提供用户名和密码发送登录请求
2、服务器检查用户名和密码是否正确,错误则直接失败。若通过检查,则生成一把访问令牌,把用户信息放到这把访问令牌对应的的盒子里,向用户返回访问令牌。
3、用户向服务器发出获取用户订单信息请求,并带上从服务器获取到的 访问令牌。
4、服务器用访问令牌打开盒子,获取到用户的基本信息,再从数据库查出用户订单信息,返回用户。
5、以后的用户和服务器交互重复 3、4步骤
这主要参考了微信公众号的做法:微信公众号:获取用户信息
微信公众号 要获取一个关注者的信息,需要的条件是 AccessToken和这个关注者的ID(OpenID)。并没有提供公众号信息,而是用一个AccessToken(访问令牌)代替,也就是说微信服务器保存了一个 < 访问令牌,公众号信息 > 列表,通过AccessToken可以获取到一个微信公众号相关信息。
而这个AccessToken是怎么获取的呢?微信公众号:获取AccessToken
微信公众号 要获取一个AccssToken需要提供 公众号ID(AppID)和一个密码(Secret),这不是相当于提供用户名和密码去获取AccessToken(访问令牌)吗?
通信过程的安全性
从上面的的介绍可知,每次用户都会发送HTTP请求,一个典型的交互过程如下:以JSON数据格式为例
Request:
{"Command": "GetOrderList","AccessToken": "3bf63b28-bdd2-4bb1-80b0-8d5b42070222"}
Response:
{"success": true,"OrderList": [{"NO": "20150327131072","OrderTime": "2015-03-27 09:33:20","TotalCost": 118,"Detail": [{"Product": {"GUID": "4bb603b2-0916-412d-ae51-b296c838673b","Name": "时蔬锅摊","MainPicture": "5(8).JPG"},"Count": 1,"Price": 28},{"GUID": "630e38dd-60ae-4ed0-98f0-affea23c5fee","Product": {"GUID": "da9dce4a-101e-45dc-a88e-3b5e296ca092","Name": "香锅猪蹄","MainPicture": "2(1).JPG"},"Count": 1,"Price": 58},{"GUID": "6018c248-64e2-4185-98db-c1408aa0d482","Product": {"GUID": "a405b104-f0eb-488c-ac41-a8a3de2f0bca","Name": "农家酥肉汤","MainPicture": "7(10).JPG"},"Count": 1,"Price": 32}]},{"NO": "20150325131079","OrderTime": "2015-03-25 17:38:15","TotalCost": 58,"Status": 2,"Detail": [{"GUID": "77df4888-8c88-4c51-b669-7471a8ae975b","Product": {"GUID": "da9dce4a-101e-45dc-a88e-3b5e296ca092","Name": "香锅猪蹄","MainPicture": "2(1).JPG"},"Count": 1,"Price": 58}]}]}可以看到,用户获取自己的订单,提供了 访问令牌 ,返回用户订单,这里展示下显示效果~
从上面通信过程可以看到,均是由明文在网络中传输中,,而对于用户订单这么敏感的数据,实在不妥。一旦在传输过程中,这个 访问令牌 被截获,后果不堪设想,也就是说我们要想办法去保证传输过程中的安全性。
一想到传输过程中的安全性,我们一下就想到了HTTPS,对传输的所有数据都进行加密。HTTPS无疑可以解决这个问题,它被设计的目的就是为了保证传输过程中的安全性。
当我们安全性不需要做到像 银行 那种级别,HTTPS是否是最佳的方案呢?我看未必,你可以向下看,接下来提供一种思路。
参考QQ邮箱的做法:QQ邮箱登陆页面
登录页面
有的旅行是为了拓宽眼界,浏览风景名胜。