[TOC]
RESTful
- Representational State Transfer,表现层状态转换。
- 资源指一个互联网的实体,比如一个图片,一篇文章。每个URI代指一个唯一的实体。
- 表现层指一个实体的呈现形式,比如图片的jpg或者png格式,或者它的缩略图形式,thumb.jpg。这些都不应该在URI中体现,而应该在头信息中。
- 状态转换,让服务器端进行状态转换,有GET,POST,PUT,DELETE等。
- 所以在一个URI中不应该体现出和实体无关的东西,比如/1/delete就是不符合的。
- 版本信息可以放到URI中。
用户登录相关
RESTful最重要的一个设计原则就是,客户端和服务器的交互是无状态的。每次都需要带上身份信息。
-
传统浏览器使用cookie和session。在APP中,服务器端建立一个映射就行,比如uid5对应3n4tef344nfed,登陆后分配一个token值,使用token值来识别用户。使用HTTPs协议防止token值被截获。
-
没有HTTPs的情况下,可以使用如下方法加密:
请求test.com/user/info,使用md5(“test.com/user/info&token=daf32da456hfdh”)= C99DC0C22437AC275C08CE4A9708B25A的签名,
然后请求test.com/user/info?userId=5&sign= C99DC0C22437AC275C08CE4A9708B25A,
服务器端收到请求后,用同样的算法算出签名,如果一致就通过。
-
上面的方法有一个问题,就是可能被人截获后重复提交,所以解决方法是加上时间戳,
md5(“test.com/user/info?userId=5&token=daf32da456hfdh×tamp=1425860757”)= C116161A6F430343B6CECF08562F1371
然后请求test.com/user/info?userId=5×tamp=1425860757&sign= C116161A6F430343B6CECF08562F1371
这样带上时间戳,时间戳是不能被修改的,否则签名无效,
服务器收到请求后,先检测时间是否符合预期范围内,然后比对签名。
-
上面的方法在第一次获取token的时候还是有风险,这时可以使用对称加密来解决,AES加密。
上面这是内部接口,一般外部接口还是用Auth2.0.