欢迎光临,了解微信小程序开发,就上易用通!

微信小程序登录态验证流程

发布:2018-01-26 10:02浏览: 来源:网络 作者:cola

点击进入原地址小程序调用wx.login得到code.调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。用户数据的加解密通讯需要依赖会话密钥完成 ...

 
 
 

点击进入原地址

微信小程序登录态验证流程(图1)

  1. 小程序调用wx.login得到code.

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

  2. 小程序调用wx.getUserInfo得到rawData, signatrue, encryptData.

  3. 小程序调用server获取token接口, 传入code, rawData, signature, encryptData.

  4. server调用微信提供的jsoncode2session接口获取openid, session_key, 调用失败应给予客户端反馈, 微信侧返回错误则可判断为恶意请求, 可以不返回. 微信文档链接

    这是一个 HTTP 接口,开发者服务器使用登录凭证 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"

  5. server计算signature, 并与小程序传入的signature比较, 校验signature的合法性, 不匹配则返回signature不匹配的错误. 不匹配的场景可判断为恶意请求, 可以不返回. 微信文档链接

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

    将 signature、rawData、以及用户登录态发送给开发者服务器,开发者在数据库中找到该用户对应的 session-key,使用相同的算法计算出签名 signature2 ,比对 signature 与 signature2 即可校验数据的可信度。

  6. 使用第4步返回的session_key解密encryptData, 将解得的信息与rawData中信息进行比较, 需要完全匹配, 解得的信息中也包括openid, 也需要与第4步返回的openid匹配. 解密失败或不匹配应该返回客户相应错误. 微信文档链接

    • 接口如果涉及敏感数据(如wx.getUserInfo当中的 openid ),接口的明文内容将不包含敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptData )进行对称解密。 解密算法如下:

    1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
    2. 对称解密的目标密文为 Base64_Decode(encryptData),
    3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节
    4. 对称解密算法初始向量 iv = aeskey, 同样是16字节

    • rawData格式:
    {
        "nickName": "Band",
        "gender": 1,
        "language": "zh_CN",
        "city": "Guangzhou",
        "province": "Guangdong",
        "country": "CN",
        "avatarUrl": "https://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"
    }
    
    • encryptData解密之后格式:
    {
        "openId": "OPENID",
        "nickName": "NICKNAME",
        "gender": 1,
        "city": "CITY",
        "province": "PROVINCE",
        "country": "COUNTRY",
        "avatarUrl": "AVATARURL",
        "unionId": "UNIONID"
    }
    
  7. 使用session_key作为密钥, 加密至少包括openid, timestamp, random(随机值), version(版本)的内容, 得到token. 加密算法可以参考微信对encryptData的加密算法. server应该缓存session_key, 缓存的过期时间不应该小于token的过期时间. 将openid, token返回给客户端.

  8. 小程序每次业务请求都必须带上openid和token, server验证token的合法性: token能否被正常解密; 解密后的openid和传入的openid是否一致; 解密后可得到token的生成时间, token是否过期. 全部校验通过即可正常处理业务请求.






免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。