小程序:授权、登录、session_key、unionId的详解


Posted in Javascript onMay 15, 2019

微信应用的一个很大的优势就在于使用过程中是不需要进行注册和显式登录的,大部分问题基本上可以一键解决。但是在授权、登录和获取用户信息的过程中都发生了哪些事情,今天我们就来讨论一下。这篇文章主要分析以下几个问题:

  1. 授权和登录的意义
  2. session_key 的作用
  3. unionId 的作用,有哪些获取途径
  4. 在应用中如何保存用户登录态

1. 授权和登录的意义

首先必须要明白,授权和登录实际上是两个操作。

1.1 授权(已废弃)

那授权的作用是啥呢?从小程序官方文档中我们可以看到授权操作只需通过wx.authorize() 接口便可以完成,以下是文档中对授权操作的描述:

提前向用户发起授权请求。调用后会立刻弹窗询问用户是否同意授权小程序使用某项功能或获取用户的某些数据,但不会实际调用对应接口。如果用户之前已经同意授权,则不会出现弹窗,直接返回成功。

也就是说,授权过程实际上只是在小程序前端获得了操作部分wx 接口的访问许可,这个过程实际上是不会与开发者服务器发生任何关系的。那这些访问许可包含哪些内容呢?再来看微信官方提供的scope 列表:

小程序:授权、登录、session_key、unionId的详解

注:新版api已废弃wx.authorize(),具体信息查看https://developers.weixin.qq.com/miniprogram/dev/api/open.html

1.2 登录

所谓的登录就是要让开发者服务器知道当前的用户是谁?在传统的web 应用中,我们必须要让用户输入账号和密码才能实现登录操作。但是在微信应用中,我们可以通过微信服务器来完成这个操作,获取到与当前用户对应的唯一标志(openId),具体操作实现流程如下:

注:每个用户相对于每个微信应用(公众号或者小程序)的openId 是唯一的,也就是说一个用户相对于不同的微信应用会存在不同的openId

小程序:授权、登录、session_key、unionId的详解

从上图中,我们可以看出,小程序中登录步骤如下:

① 小程序前端使用wx.login() 从微信服务器获取code

② 小程序前端将code 发送给开发者服务器,开发者服务器利用appId、appSecret 和code 向微信服务器换换取用户openId 和session_key

③ 开发者服务器自定义登录态并将其与openId 和session_key 关联起来然后写session

④ 开发者服务器将登录态返回给小程序前端,小程序前端使用wx.setStorageSync() 将登录态保存起来

⑤ 小程序前端在执行业务请求时将登录态发送给开发者服务器,以便开发者服务器知道当前操作的用户是哪位。

也就是说,在整个过程中小程序前端是拿不到用户openId 的,它只能通过开发者服务器发给它的登录态来告诉服务器当前用户的信息。登录过程中涉及session_key 和unionId,于是又引出了下面的问题。

2. session_key 的作用

那么,session_key 在登录的过程中或者登录完成后起什么作用呢?一起来看一下。

2.1 wx.getUserInfo

首先来看一下wx.getUserInfo 这个api:

小程序:授权、登录、session_key、unionId的详解

在设置withCredentials 属性为true 的情况下,这个api 可以拿到encryptedData,iv 等敏感信息,encryptedData 需要使用session_key 进行解密,解密后可以拿到的数据如下:

小程序:授权、登录、session_key、unionId的详解

也就是说,session_key 的作用之一是将小程序前端从微信服务器获取到的encryptedData 解密出来,获取到openId 和unionId 等信息。但是在1.2 登录过程中我们可以看到开发者服务器是能够直接拿到用户的openId 信息的,而且unionId 也是有其他获取途径的,所以session_key 在这里的作用看起来有点鸡肋。

2.2 getPhoneNumber

session_key 更重要的作用大概体现在获取用户手机方面(可能还包含其他敏感信息获取api)。

小程序:授权、登录、session_key、unionId的详解

从文档中可以看到getPhoneNumber 返回的用户数据是加密过的,只有使用session_key 才能解密,而小程序前端没有session_key,所以无法获取到用户的手机,只能传到开发者服务器进行处理。

3. unionId 的作用,有哪些获取途径?

关于unionId 的作用,可以参考Ref 中的连接。简单来说,就是同一用户针对同意微信公众平台下绑定的所有应用都具有相同的unionId。

获取途径有三种,在官方文档中写的比较清楚:

小程序:授权、登录、session_key、unionId的详解

4. 在应用中如何保存用户登录态

保存用户登录态,一直以来都有两种解决方案:前端保存和后端保存。

4.1 后端保存

在1.2 步骤③ 中写session 的时候可以直接设定过期时间,定期通知小程序前端重新进行登录(wx.login)。

4.2 前端保存

因为session_key 存在时效性问题(毕竟是用来查看敏感信息),而小程序前端可以通过wx.checkSession() 来检查session_key 是否过期。所以可以通过这个来作为保存用户登录态的机制,这也是小程序文档中推荐的方法:

小程序:授权、登录、session_key、unionId的详解

Ref: 微信小程序 获取session_key和openid

Ref: 微信UnionID作用

Ref: 小程序官方文档

以上所述是小编给大家介绍的小程序:授权、登录、session_key、unionId的详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript 一个函数对同一元素的多个事件响应
Jul 25 Javascript
jQuery 扩展对input的一些操作方法
Oct 30 Javascript
javascript for循环设法提高性能
Feb 24 Javascript
js 获取、清空input type="file"的值(示例代码)
Dec 24 Javascript
window.location的重写及判断location是否被重写
Sep 04 Javascript
在 Express 中使用模板引擎
Dec 10 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
Dec 24 Javascript
node.js中 stream使用教程
Aug 28 Javascript
jQuery表单设置值的方法
Jun 30 jQuery
jquery+ajaxform+springboot控件实现数据更新功能
Jan 22 jQuery
微信小程序与后台PHP交互的方法实例分析
Dec 10 Javascript
微信小程序如何实现点击图片放大功能
Jan 21 Javascript
javascript+HTML5 canvas绘制时钟功能示例
May 15 #Javascript
详解小程序用户登录状态检查与更新实例
May 15 #Javascript
基于vue如何发布一个npm包的方法步骤
May 15 #Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
May 15 #Javascript
JavaScript页面倒计时功能完整示例
May 15 #Javascript
vue组件间通信六种方式(总结篇)
May 15 #Javascript
JS正则表达式封装与使用操作示例
May 15 #Javascript
You might like
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
CI框架安全类Security.php源码分析
2014/11/04 PHP
PHP中浮点数计算比较及取整不准确的解决方法
2015/01/09 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
Javascript实现的分页函数
2006/12/22 Javascript
javascript globalStorage类代码
2009/06/04 Javascript
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
2016/06/12 Javascript
Angular 4.0学习教程之架构详解
2017/09/12 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
2019/01/08 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
python网页请求urllib2模块简单封装代码
2014/02/07 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
Python初学者常见错误详解
2019/07/02 Python
使用Python函数进行模块化的实现
2019/11/15 Python
python实现异常信息堆栈输出到日志文件
2019/12/26 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
财务会计专业个人求职信范本
2014/01/08 职场文书
项目合作计划书
2014/01/09 职场文书
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
《老山界》教学反思
2014/04/08 职场文书
运动会开幕词
2015/01/28 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
宾馆客房管理制度
2015/08/06 职场文书
筑梦中国心得体会
2016/01/18 职场文书
frg-100简单操作(设置)说明
2022/04/05 无线电