前置知识:微信授权登录过程和相关名词,access_token、code、openid等;
微信授权登录,大都是拉起微信授权页面,用户同意授权后,再跳到自己应用的绑定手机页面进行绑定手机的操作,绑定之后自动登录,会话就像不会过期一样,或者是过期以后再次点一次授权按钮即可。不用像以前一样,每次都用密码或验证码登录,让用户再做繁琐的登录操作。
如图,第一次微信授权还好,因为没有绑定,所以需要手机验证码来确保是本人授权绑定的。但是已经绑定的,就要直接做无感登录。那么问题就来了,不用频繁的验证码和密码,不用和用户产生交互,怎么保障绑定后的无感登录不是伪装的?首先看无感登录需要元素:手机号和微信用户标识openid。手机号肯定是暴露在外的,那如果openid也暴露的话,所有知道用户手机号和openid的人都可以登录,是不安全的。确保openid不暴露,可以有以下的操作:
(1)可以对其进行RSA加密传输,到后台再解密;
(2)微信回调返回code,直接作为无感登录入参,传到后台,在后台加上appId和appSerect获取openid;
那么延申到其他恒定的、交互频密的、有关登录等敏感操作的字段数据,要保障其安全,手段有哪些?从什么方面去考虑呢?
(1)app端混淆(加密)之后再存储;
(2)常用RSA等非对称加密算法加密之后再作为入参调用接口,到后台解密获取真正的数据;
(3)用有时效性或协定可变的字段代替,例如上述的code,只有10分钟的生存时间,而且得再加上交互过程中没有的appSerect才能换取真正的openid;
(4)限定调用发起方的范围和数量;
其实就是三方面,一是加大获取真正的关键数据的难度;二是加上时效性限制,减少伪装成功的损失;三是限定调用发起方范围;
以上只是我个人思路,如果有错误漏洞或是更优思路欢迎交流。