Fork me on GitHub

微信小程序的登录和登录状态维护

在微信小程序开发中,登录和登录状态维护,是一套比较固定的流程。

本篇博客对小程序的用户登录及登录状态的维护的流程,进行了总结和介绍。

也涉及到了获取用户信息这一常见的开发需求。

登录

微信小程序的登录主要步骤如下:

  1. 客户端调用 wx.login() ,获得返回参数 code

  2. 客户端调用 wx.request()code 发送到服务器

  3. 服务器将 code 和存储在服务器的 appidappSecret 共三个参数作为请求参数,向微信服务器接口发起请求获得返回参数 openidsession_key

    openid 是用户唯一标识。

    session_key 是针对用户数据进行加密签名的密匙。session_key在文件校验,获取用户信息时均需使用

    微信服务器返回的两个参数一般为了安全起见,都不会发往客户端。

    微信服务器的请求接口地址为:https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

  4. 服务器使用 openidsession_key 生成 3rd_session 作为自己派发的登陆态标识token,将其发送到小程序客户端。

    在生成 3rd_session 时,将 3rd_session 作为键,将session_key + openid 作为值,存储在 服务器的 session 存储中。每个3rd_session都需要设置一个失效时间。

  5. 小程序客户端将 3rd_session 存入 storage

  6. 后续用户进入小程序时,首先调用wx.checksession() 检测登陆态,如果失败,重新发起登陆流程。

  7. 如果登陆状态未失效,则从 storage 中读取 3rd_session。在需要用户标识的 wx.request() 时作为用户标识发送到服务器检验,服务器判断其是否合法。

获取用户信息

获取用户信息时,根据微信请求用户信息接口wx.getUserinfo()函数的请求参数withCredentials的布尔值及用户的登陆状态不同,会有不同的返回值。

  1. withCredentialstrue 且 用户登陆态未到期

    返回的数据会包括 encryptedDataiv等敏感数据。如下:

    1. userinfo 不包含敏感数据的用户信息

    2. rawData 不包含敏感数据的原始数据字符串,用于签名校验

    3. signature。 使用sha1( rawData + sessionkey ) 得到的字符串,用于签名校验数据

    4. encryptedData 包含 openIdunionId 等用户敏感数据的加密数据

    5. iv 加密算法的初始向量

  1. 当withCredentials 为 false

    不要求登陆状态,返回数据不包含敏感数据。


小程序的数据签名校验和数据解密

签名校验(用于校验数据完整性等):

需要使用session_key。客户端将 signaturerawData 发送到服务器,服务器通过相同的 sha1( rewData + session_key) 算法计算出 signature2,并与客户端发送过来的signature对比,校验数据完整性。


加密数据encryptedData的解密:

需要客户端将接口返回的encryptedData发送到服务器,服务器使用 appIdsession_key ,根据加密算法的初始向量 ivencryptedData 进行解密(微信提供有后端解密代码,包括python,php等(无java)

----本文结束感谢阅读----