126.API(开放接口--登录)

wx.login(OBJECT):

调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)用户数据的加解密通讯需要依赖会话密钥完成。


126.API(开放接口--登录)_第1张图片


代码:

126.API(开放接口--登录)_第2张图片

code 换取 session_key:

​ 这是一个 HTTPS 接口,开发者服务器使用登录凭证 code获取 session_key 和 openid。其中 session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不应该在网络上传输

接口地址:

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code


126.API(开放接口--登录)_第3张图片

代码:

126.API(开放接口--登录)_第4张图片

wx.checkSession(OBJECT):

通过上述接口获得的用户登录态拥有一定的时效性。用户越久未使用小程序,用户登录态越有可能失效。反之如果用户一直在使用小程序,则用户登录态一直保持有效。具体时效逻辑由微信维护,对开发者透明。开发者只需要调用wx.checkSession接口检测当前用户登录态是否有效。登录态过期后开发者可以再调用wx.login获取新的用户登录态。


126.API(开放接口--登录)_第5张图片

代码:

126.API(开放接口--登录)_第6张图片

用户数据的签名验证和加解密:

数据签名校验:

1.签名校验算法涉及用户的session_key,通过wx.login登录流程获取用户session_key,并自行维护与应用自身登录态的对应关系。

2.通过调用接口(如wx.getUserInfo)获取数据时,接口会同时返回 rawData、signature,其中 signature = sha1( rawData + session_key )

3.开发者将 signature、rawData 发送到开发者服务器进行校验。服务器利用用户对应的 session_key 使用相同的算法计算出签名 signature2 ,比对 signature 与 signature2 即可校验数据的完整性。

如wx.getUserInfo的数据校验:

126.API(开放接口--登录)_第7张图片

用户的 session-key:

HyVFkGl5F5OQWJZZaNzBBg==

用于签名的字符串为:

{"nickName":"Band","gender":1,"language":"zh_CN","city":"Guangzhou","province":"Guangdong","country":"CN","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"}HyVFkGl5F5OQWJZZaNzBBg==}

使用sha1得到的结果为:

75e81ceda165f4ffa64f4068af58c64b8f54b88c

加密数据解密算法

1.对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。

2.对称解密的目标密文为 Base64_Decode(encryptedData)。

3.对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。

4.对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。


126.API(开放接口--登录)_第8张图片

如接口wx.getUserInfo敏感数据当中的watermark:

126.API(开放接口--登录)_第9张图片

你可能感兴趣的:(126.API(开放接口--登录))