转载于未知名博客api
出于安全kao虑,近期推动一次app和api间通信的认证的流程。舍弃了app认证这种思路,走的用户受权的思路。安全
具体流程以下:服务器
就是app第一次启动时,向服务器请求得到accessId 受权id,accessToken 受权token,accessExp 受权过时时间。 app
接口请求的时候,将参数,时间戳,accessToken哈希,做为sign附加在参数上。(若是上https,只要将accessToken附加返回就行了) spa
当用户登陆的时候,将用户id和accessId关联,存于服务器端。 token
操做用户数据接口获取到用户id后校验和accessId关联的用户id比较是否一致。 接口
之后手机启动的时候,拿保存的access信息,请求更新接口,获取新的access信息。 内存
kao虑的安全问题:博客
数据私密性,让数据在传输过程当中不可见,避免偷窥狂,解决办法是上https,第一期不作。 hash
数据完整性,防止数据发出后被篡改,解决办法是上https,第一期特么不上https,第二期又不知道在哪里。因此,将全部参数,加上时间戳,和access_token拼接后进行hash获得sign,附加在请求里面。服务端对sign进行校验。保证参数不被篡改。
请求幂等性,一个请求只请求一次有效,例如A给B转帐,这个请求调用屡次,只会转帐一笔。经过accessId,接口,时间戳做为惟一判断来避免重放。
密钥泄漏,app被反编译,密钥丢了怎么办,因此舍弃app受权,改用对用户受权。
内存修改器,app若是直接持有memberId与服务端通信,假如memberId被修改,防线瞬间就瓦解了,因此不以app持有的memberId为凭证,而是以accessId关联的memberId为准。