微信小程序的登陆流程详解
小程序登陆和登陆状态维护
1.客户端调用 wx.login() ,获得返回参数 code
2.客户端调用 wx.request() 将 code 发送到服务器
3.服务器将 code 和存储在服务器的 appid 和 appSecret 共三个参数作为请求参数加入URL,向下面的微信服务器接口发起请求:
服务器会获得返回参数 openid 和 session_key 。这两个数据主要用在支付,数据签名,数据解密等与用户登陆态和标识有关的逻辑中。
openid是用户唯一标识,但不建议直接用做后端服务器的各用户标示符。
session_key 是针对用户数据进行加密签名的密匙。session_key在文件校验,获取用户具体信息时均需使用
一般为了安全起见,这两个数据都不会发往客户端。
4.服务器应使用 openid 和 session_key 生成 3rd_session ,作为服务器派发给用户的登陆态标识token,用于用户的权限和数据管理。将其发送到小程序客户端。
5.小程序客户端将 3rd_session 存入 storage中。
6.后续用户进入小程序时,首先调用 wx.checkSession() 检测登陆态,如果失败,重新发起登陆流程。
ps.微信文档中说明使用 wx.checkSession() 来进行用户登陆态的时间管理,使开发者无需再开发用户登陆态时间管理逻辑,但实际开发中,wx.checkSession存在延迟,导致用户刚进入小程序时比较卡,所以建议开发者仍然自己去处理用户的登陆态过期时间管理,根据用户的token来使用相关逻辑进行处理。
7.如果检测用户登陆状态未失效,则从 storage 中读取 3rd_session。在需要用户标识的 wx.request() 时作为用户标识发送到服务器检验,服务器判断其是否合法。
ps.在生成 3rd_session 时,将 3rd_session 作为键,将 session_key + openid 作为值,存储在 服务器的 session 存储或数据库中。每个3rd_session都需要设置一个失效时间用来进行用户登陆态管理。
获取用户信息
微信官方禁止无必要的获取用户信息,尤其是在用户刚进入小程序时。开发者最好在需要时再调用接口获取用户信息,保证小程序的审核通过。
获取用户信息主要有以下要点:
根据微信请求用户信息接口wx.getUserinfo()函数的请求参数withCredentials的布尔值及用户的登陆状态不同,会有不同的返回值。
1.当withCredentials 为 true 且 用户登陆态未到期
返回的数据会包括 encryptedData,iv等敏感数据。
请求用户信息返回数据项如下:
- userinfo 不包含敏感数据的用户信息
- rawData 不包含敏感数据的原始数据字符串,用于签名校验
- signature。 使用sha1( rawData + sessionkey ) 得到的字符串,用于签名校验数据
- encryptedData 包含 openId,unionId 等用户敏感数据的加密数据
- iv 加密算法的初始向量
2.当withCredentials 为 false 时
不要求登陆状态,返回数据不包含敏感数据,只包含用户的基本信息 userinfo 和 校验数据的rowData。
小程序的数据签名校验和数据解密
顺便提一下小程序的签名校验和数据解密
签名校验(用于校验数据完整性等):
需要使用session_key。客户端将 signature 和 rawData 发送到服务器,服务器通过相同的 sha1( rewData + session_key) 算法计算出 signature2,并与客户端发送过来的signature对比,校验数据完整性。
加密数据encryptedData的解密:
需要客户端将接口返回的encryptedData发送到服务器,服务器使用 appId 和 session_key ,根据加密算法的初始向量 iv 对 encryptedData 进行解密(微信提供有后端解密代码,包括python,php等(无java)
微信小程序的登陆流程详解的更多相关文章
- 微信小程序开发之详解生命周期方法
生命周期是指一个小程序从创建到销毁的一系列过程 在小程序中 ,通过App()来注册一个小程序 ,通过Page()来注册一个页面 先来看一张小程序项目结构 从上图可以看出,根目录下面有包含了app.js ...
- 微信小程序的配置详解
1.配置详解: 使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. 1>pages 接受一个数组,每一项都是字符串,来指定小 ...
- 微信小程序 生命周期函数详解
微信小程序 生命周期函数 小程序中 判断当前首页是从其他页面返回,还是由入口打开 由于小程序的数据在我们退出小程序时并没有得到释放,因此再次点击开来数据依然没有变成初始化 解决方法:在小程序 data ...
- 微信小程序开发者工具详解
一.微信小程序web开发工具下载地址 1.1 在微信公众平台-小程序里边去下载开发工具下载地址. 1.2 下载后安装一下就可以使用了: 二.创建项目 2.1 微信小程序web开发工具需要扫码登陆,所以 ...
- 微信小程序wxss样式详解
一.wxml 界面结构wxmL比较容易理解,主要是由八大类基础组件构成: 一.视图容器(View Container): 二.基础内容(Basic Content) 组件名 说明 组件名 说明 vie ...
- 微信小程序 Mustache语法详解
最近微信小程序非常火,对于前端开发的程序员是个利好的消息,这里主要记录下微信小程序 Mustache语法. 小程序开发的wxml里,用到了Mustache语法.所以,非常有必要把Mustache研究 ...
- 微信小程序页面传值详解
我们知道,在微信小程序中,从一个页面转到另一个页面,一般情况下可以通过navigate或redirect时候的url来携带参数,然后在目标页面的onLoad函数参数中获取这些url参数.例如: / ...
- 微信小程序生命周期详解
文章出处:https://blog.csdn.net/qq_29712995/article/details/79784222 在我看来小程序的生命周期虽然简单,但是他渗透了小程序开发的整个过程,对于 ...
- 微信小程序模板消息详解
先放代码 wxml: <form name='pushMsgFm' report-submit bindsubmit='orderSign'> <view> 单号: 0< ...
随机推荐
- File 常用方法
1.判断当前文件是否封装的文件夹目录 //返回true--是,false--不是 File file =new File("C:\\Users\\mac\\Desktop\\复习.txt&q ...
- Your data vis “Spidey-sense” & the need for a robust “utility belt”
@theboysmithy did a great piece on coming up with an alternate view for a timeline for an FT piece. ...
- R语言进行文件夹操作示例(转)
rm(list=ls())path = 'J:/lab/EX29 --在R语言中进行文件(夹)操作'setwd(path)cat("file A\n", file="A& ...
- gulp - less 在node.js上的安装和使用
推荐个一个网站 http://www.ydcss.com/ 很详细的入门gulp 官网 http://www.gulpjs.com.cn/docs/getting-started/ 下面 是我的个人总 ...
- h5 + nginx + php 视频上传之突破文件大小受限的解决办法
一.环境: CentOS 6.8 nginx 1.8.0 php 7.0.10 二.背景 基于 nginx + php 的 h5 项目,上传视频的时候,如果视频太大,会上传失败. 三.正文 一份视频传 ...
- 写了一个Mac快速设置、打开和关闭Web代理的Shell命令
缘由(痛点) 每次在Mac上设置Web代理,都需要点开"系统偏好设置 -- 网络 -- 高级 -- 代理",然后分别设置Web代理(HTTP)和安全Web代理(HTTPS),设置完 ...
- java封装FFmpeg命令,支持原生ffmpeg全部命令,实现FFmpeg多进程处理与多线程输出控制(开启、关闭、查询),rtsp/rtmp推流、拉流
前言: 之前已经对FFmpeg命令进行了封装http://blog.csdn.net/eguid_1/article/details/51787646,但是当时没有考虑到扩展性,所以总体设计不是太好, ...
- MyEclipse解决SVN同步冲突问题conflict in the working copy obstructs the current operation
服务端版本控制软件subversion,客户端是eclipse的插件subclipse.当删除一个东西的时候老是提示错误,说冲突 commit -m "" C:/Users/Adm ...
- 补:关于man关于SEE ALSO(参见)中代号与vim下常用命令
1.查阅/etc/issue文件时,使用man issue发现manual中see also出现motd(5), agetty(8), mingetty(8)字样.以及文档行首的issue(5)究竟是 ...
- Zookeeper:分布式程序的基石
一.目录 1.zookeeper是什么? 2.安装.配置.启动.监控 3.javaApi基础用法 4.应用场景 5.CAP理论/paxos算法 二.zookeeper简介 官方版:zookeeper是 ...