本文为个人理解,如有错误,还请指正
本文为个人理解,如有错误,还请指正
逻辑关系梳理
- 首先说明,只有在需要获取
union_id
、用户手机号
等(需要防止前端传输泄露的)数据时才会需要encryptedData
encryptedData
是getUserInfo
、getphonenumber
等返回的数据,需要session_key
来解密- 而
session_key
是wx.login
获得code
后,由服务端去请求的数据(一个是openid
一个是session_key
) - 然而
session_key
存在有效期,getUserInfo
等也需要用户点击按钮才能获取到数据 - 重点在于:假设我在App.vue中启动即调用
wx.login
做自动登录,而获取union_id
、手机号
等需要用户点击按钮触发。我们并不确定用户什么时候点击按钮,获得的encryptedData
很可能用上次调用wx.login
时得到的session_key
解密不了,因为他过期了。 - 所以有
wx.checkSession
来判断用户的session_key
是否过期,如果过期,需要重新执行wx.login
获取code
,然后服务端用code去请求session_key
分析作用
- 之所以会有这几样东西,是因为微信的大佬们不让
openid
和 union_id
、手机号
等敏感信息在前端明文传输。(引用一段话 :从安全角度考虑前端数据是不可信的, 因为前端甚至整个微信都有可能被劫持,但是encryptedData是加密数据, 无法伪造, 用于加密和解密的sessionKey只在微信后端和开发者后端传递。所以encryptedData可以用于防止这种情况出现) - 查看官方文档 wx.getUserInfo。可以看到,当withCredentials为true时,会返回encryptedData、iv等敏感信息,openid也被界定为敏感信息
- 再看这篇官方文档-服务端获取开放数据校验与解密,解密后的敏感数据示例中,包含了敏感数据openId、unionId,和其他几个非敏感数据(昵称头像等可以直接通过wx.getUserInfo获取到明文)。
- 而
openId
实际上一般是通过前端wx.login
获取的code
传递给后端,后端请求微信接口获取,所以实际上我们只用在需要unionId
、手机号
等时才需要用到这几样东西
😁欢迎加入QQ群交流: [游戏-Web-开发技术栈 ☄️] '300567032’
点击下方图标一键加入!