小程序:授权、登录、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 相关文章推荐
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
Mar 09 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
Mar 09 Javascript
基于jQuery的消息提示插件 DivAlert之旅(二)
Apr 01 Javascript
IE6浏览器下resize事件被执行了多次解决方法
Dec 11 Javascript
JavaSript中变量的作用域闭包的深入理解
May 12 Javascript
详解AngularJS 模态对话框
Apr 07 Javascript
JS、jQuery中select的用法详解
Apr 21 Javascript
js评分组件使用详解
Jun 06 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
Mar 28 jQuery
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
Jul 12 Javascript
JS实现超级好看的鼠标小尾巴特效
Dec 01 Javascript
Javascript生成器(Generator)的介绍与使用
Jan 31 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
php中call_user_func函数使用注意事项
2014/11/21 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
2016/12/14 Javascript
vue2.x select2 指令封装详解
2017/10/12 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
vuex vue简单使用知识点总结
2019/08/29 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
js实现验证码功能
2020/07/24 Javascript
jquery轮播图插件使用方法详解
2020/07/31 jQuery
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
django rest framework之请求与响应(详解)
2017/11/06 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
html5 兼容IE6结构的实现代码
2012/05/14 HTML / CSS
HTML5 canvas实现的静态循环滚动播放弹幕
2021/01/05 HTML / CSS
The North Face北面美国官网:美国著名户外品牌
2018/09/15 全球购物
英国DVD和蓝光碟片购买网站:Zoom.co.uk(电影和电视)
2019/09/23 全球购物
网络工程师职业规划
2014/02/10 职场文书
个人委托书怎么写
2014/09/17 职场文书
土地转让协议书
2014/09/27 职场文书
初中作文评语集锦
2014/12/25 职场文书
应届生简历自我评价
2015/03/11 职场文书
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers