小程序:授权、登录、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 相关文章推荐
js实现在字符串中提取数字
Nov 05 Javascript
js和jquery使按钮失效为不可用状态的方法
Jan 26 Javascript
js网页实时倒计时精确到秒级
Feb 10 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
Aug 13 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
Mar 28 Javascript
详解vue express启动数据服务
Jul 05 Javascript
AngularJS实现select的ng-options功能示例
Jul 12 Javascript
jQuery实现的简单获取索引功能示例
Jun 04 jQuery
node实现分片下载的示例代码
Oct 17 Javascript
Vue.js中的高级面试题及答案
Jan 13 Javascript
vue中v-model对select的绑定操作
Aug 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标签云的实现代码
2012/10/10 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
PHP7变量处理机制修改
2021/03/09 PHP
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
js基本算法:冒泡排序,二分查找的简单实例
2016/10/08 Javascript
微信小程序 form组件详解
2016/10/25 Javascript
canvas简单快速的实现知乎登录页背景效果
2017/05/08 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
浅谈JS的原型和继承
2019/05/08 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
python实现超简单端口转发的方法
2015/03/13 Python
Python中for循环控制语句用法实例
2015/06/02 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
python操作mysql代码总结
2018/06/01 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
Python QQBot库的QQ聊天机器人
2019/06/19 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
Python关于反射的实例代码分享
2020/02/20 Python
Python实现迪杰斯特拉算法过程解析
2020/09/18 Python
有关HTML5中背景音乐的自动播放功能
2017/10/16 HTML / CSS
公司庆典主持词
2015/07/04 职场文书
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript