微信小程序的登陆流程详解
来源:互联网 发布:php class unset 编辑:程序博客网 时间:2024/06/05 08:25
小程序登陆和登陆状态维护
1.客户端调用 wx.login() ,获得返回参数 code
2.客户端调用 wx.request() 将 code 发送到服务器
3.服务器将 code 和存储在服务器的 appid 和 appSecret 共三个参数作为请求参数,向下面的微信服务器接口发起请求:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
获得返回参数 openid 和 session_key 。
openid是用户唯一标识,session_key 是针对用户数据进行加密签名的密匙
session_key在文件校验,获取用户信息时均需使用
一般为了安全起见,这两个数据都不会发往客户端。
4.服务器使用 openid 和 session_key 生成 3rd_session 作为自己派发的登陆态标识token,将其发送到小程序客户端。
5.小程序客户端将 3rd_session 存入 storage
6.后续用户进入小程序时,首先调用 wx.checksession() 检测登陆态,如果失败,重新发起登陆流程。
7.如果登陆状态未失效,则从 storage 中读取 3rd_session。在需要用户标识的 wx.request() 时作为用户标识发送到服务器检验,服务器判断其是否合法。
ps.在生成 3rd_session 时,将 3rd_session 作为键,将 session_key + openid 作为值,存储在 服务器的 session 存储中。每个3rd_session都需要设置一个失效时间。
获取用户信息
根据微信请求用户信息接口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)
- 微信小程序的登陆流程详解
- 微信小程序注册流程详解
- 微信小程序开发流程详解
- 微信小程序支付及退款流程详解
- IOS-QQ登陆之苹果程序流程
- 关于微信小程序登陆的问题
- 简单的登陆程序
- 微信小程序--登陆接口
- 小程序支付流程详解
- 防止用户重复登陆系统(供参考程序流程思想)
- 防止用户重复登陆系统(供参考程序流程思想)
- 游戏的登陆和离线流程思考
- 第三方QQ登陆的流程
- 登陆程序的逻辑问题
- 网游测试登陆的程序
- 微信小程序的支付和退款流程
- 程序的流程控制
- 程序的数据流程
- [SMOJ2166]数列的和
- env, set, export 命令的区别
- css中word-break:break-all和word-wrap:break-word的区别
- Linux中DNS配置
- 【HDU1698】区段更新
- 微信小程序的登陆流程详解
- unix shell 变量的分类
- Python实现计算一段文本中每个单词出现的次数
- js基础语法
- Spring+Mybatis 查询所有数据时发生异常:org.apache.ibatis.reflection.ReflectionException: There is no getter for
- 将16进制的字符串转换为对应的字符
- 使用jedis操作redis之消息的发布和订阅
- jQuery学习笔记之attr()
- 原生js获取元素最终计算结果样式代码