在微信小程序开发中,登录和登录状态维护,是一套比较固定的流程。
本篇博客对小程序的用户登录及登录状态的维护的流程,进行了总结和介绍。
也涉及到了获取用户信息这一常见的开发需求。
登录
微信小程序的登录主要步骤如下:
客户端调用
wx.login(),获得返回参数code客户端调用
wx.request()将code发送到服务器服务器将
code和存储在服务器的appid和appSecret共三个参数作为请求参数,向微信服务器接口发起请求获得返回参数openid和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服务器使用
openid和session_key生成3rd_session作为自己派发的登陆态标识token,将其发送到小程序客户端。在生成
3rd_session时,将3rd_session作为键,将session_key + openid作为值,存储在 服务器的session存储中。每个3rd_session都需要设置一个失效时间。小程序客户端将
3rd_session存入storage后续用户进入小程序时,首先调用
wx.checksession()检测登陆态,如果失败,重新发起登陆流程。如果登陆状态未失效,则从
storage中读取3rd_session。在需要用户标识的 wx.request() 时作为用户标识发送到服务器检验,服务器判断其是否合法。
获取用户信息
获取用户信息时,根据微信请求用户信息接口wx.getUserinfo()函数的请求参数withCredentials的布尔值及用户的登陆状态不同,会有不同的返回值。
当
withCredentials为true且 用户登陆态未到期返回的数据会包括
encryptedData,iv等敏感数据。如下:userinfo不包含敏感数据的用户信息rawData不包含敏感数据的原始数据字符串,用于签名校验signature。 使用sha1( rawData + sessionkey )得到的字符串,用于签名校验数据encryptedData包含openId,unionId等用户敏感数据的加密数据iv加密算法的初始向量
当withCredentials 为
false时不要求登陆状态,返回数据不包含敏感数据。
小程序的数据签名校验和数据解密
签名校验(用于校验数据完整性等):
需要使用session_key。客户端将 signature 和 rawData 发送到服务器,服务器通过相同的 sha1( rewData + session_key) 算法计算出 signature2,并与客户端发送过来的signature对比,校验数据完整性。
加密数据encryptedData的解密:
需要客户端将接口返回的encryptedData发送到服务器,服务器使用 appId 和 session_key ,根据加密算法的初始向量 iv 对 encryptedData 进行解密(微信提供有后端解密代码,包括python,php等(无java)
