在微信小程序开发中,登录和登录状态维护,是一套比较固定的流程。
本篇博客对小程序的用户登录及登录状态的维护的流程,进行了总结和介绍。
也涉及到了获取用户信息这一常见的开发需求。
登录
微信小程序的登录主要步骤如下:
客户端调用
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)