小程序登陆和登陆状态维护

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

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

3.服务器将 code 和存储在服务器的 appid 和 appSecret 共三个参数作为请求参数加入URL,向下面的微信服务器接口发起请求:

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() 检测登陆态,如果失败,重新发起登陆流程。

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等敏感数据。

请求用户信息返回数据项如下:

  1. userinfo 不包含敏感数据的用户信息
  2. rawData 不包含敏感数据的原始数据字符串,用于签名校验
  3. signature。 使用sha1( rawData + sessionkey ) 得到的字符串,用于签名校验数据
  4. encryptedData 包含 openId,unionId 等用户敏感数据的加密数据
  5. 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)

微信小程序的登陆流程详解的更多相关文章

  1. 微信小程序开发之详解生命周期方法

    生命周期是指一个小程序从创建到销毁的一系列过程 在小程序中 ,通过App()来注册一个小程序 ,通过Page()来注册一个页面 先来看一张小程序项目结构 从上图可以看出,根目录下面有包含了app.js ...

  2. 微信小程序的配置详解

    1.配置详解: 使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. 1>pages 接受一个数组,每一项都是字符串,来指定小 ...

  3. 微信小程序 生命周期函数详解

    微信小程序 生命周期函数 小程序中 判断当前首页是从其他页面返回,还是由入口打开 由于小程序的数据在我们退出小程序时并没有得到释放,因此再次点击开来数据依然没有变成初始化 解决方法:在小程序 data ...

  4. 微信小程序开发者工具详解

    一.微信小程序web开发工具下载地址 1.1 在微信公众平台-小程序里边去下载开发工具下载地址. 1.2 下载后安装一下就可以使用了: 二.创建项目 2.1 微信小程序web开发工具需要扫码登陆,所以 ...

  5. 微信小程序wxss样式详解

    一.wxml 界面结构wxmL比较容易理解,主要是由八大类基础组件构成: 一.视图容器(View Container): 二.基础内容(Basic Content) 组件名 说明 组件名 说明 vie ...

  6. 微信小程序 Mustache语法详解

    最近微信小程序非常火,对于前端开发的程序员是个利好的消息,这里主要记录下微信小程序  Mustache语法. 小程序开发的wxml里,用到了Mustache语法.所以,非常有必要把Mustache研究 ...

  7. 微信小程序页面传值详解

    我们知道,在微信小程序中,从一个页面转到另一个页面,一般情况下可以通过navigate或redirect时候的url来携带参数,然后在目标页面的onLoad函数参数中获取这些url参数.例如:   / ...

  8. 微信小程序生命周期详解

    文章出处:https://blog.csdn.net/qq_29712995/article/details/79784222 在我看来小程序的生命周期虽然简单,但是他渗透了小程序开发的整个过程,对于 ...

  9. 微信小程序模板消息详解

    先放代码 wxml: <form name='pushMsgFm' report-submit bindsubmit='orderSign'> <view> 单号: 0< ...

随机推荐

  1. web前端面试题记录

    记录了2017年5月下旬刚毕业时面试的经典面试题 布局方面 1. 响应式布局,左侧栏目固定,右侧内容随着屏幕宽度变化而变化(高频) flex布局 position布局 css3计算宽度 float布局 ...

  2. 使用VideoView开发视频总结

    一.VideoView及其相关组件总结 在Android中,播放视频有2种方式,第一种方式是使用MediaPlayer结合SurfaceView来播放,通过MediaPlayer来控制视频的播放.暂停 ...

  3. JVM-5.字节码执行引擎

    一.概述 二.栈帧结构 三.方法调用 四.方法执行       一.概述 虚拟机与物理机 虚拟机是一个相对于物理机的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.硬件. ...

  4. javaSE_08Java中static、继承、重写-思维导图

    思维导图看不清楚时: 1)可以将图片另存为图片,保存在本地来查看 : 2)右击在新标签中打开放大查看 (IE不支持,搜狗,360可以):

  5. NLTK学习笔记(三):NLTK的一些工具

    主要总结一下简单的工具:条件频率分布.正则表达式.词干提取器和归并器. 条件分布频率 <自然语言学习>很多地方都用到了条件分布频率,nltk提供了两种常用的接口:FreqDist 和 Co ...

  6. git初步用法

    三.       Gerrit的注册及使用 1.         简介 Gerrit为代码审核工具,git提交的代码,必须经过审核才能合入到正式的版本库中. 2.         注册步骤 (1)   ...

  7. Aop初步了解

    AOP(aspect-oriented programming) aspect是一种新型的模块化机制,用来描述分散在对象,类或函数中横切关注点.从关注点中分离出横切关注点是面向切面的程序设计的核心概念 ...

  8. 用Nodejs做一个简单的小爬虫

    Nodejs将JavaScript语言带到了服务器端,作为js主力用户的前端们,因此获得了服务器端的开发能力,但除了用express搭建一个博客外,还有什么好玩的项目可以做呢?不如就做一个网络爬虫吧. ...

  9. redis可视化客户端工具

    TreeNMS是一款redis,Memcache可视化客户端工具,采用JAVA开发,实现基于WEB方式对Redis, Memcached数据库进行管理.维护. 功能包括:NoSQL数据库的展示,库表的 ...

  10. Java 变量类型

    局部变量 成员变量 类变量 Java局部变量 局部变量声明在方法.构造方法或者语句块中: 局部变量在方法.构造方法.或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁: 访问修饰符不能用于局 ...