微信小程序获取用户信息并保存登录状态详解


Posted in Javascript onMay 10, 2019

前言

微信小程序的运行环境不是在浏览器下运行的。所以不能以cookie来维护登录态。下面我就来说说我根据官方给出的方法来写出的维护登录态的方法吧。

一、登录态维护

官方的文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject

通过 wx.login() 获取到用户登录态之后,需要维护登录态。开发者要注意不应该直接把 session_key、openid 等字段作为用户的标识或者 session 的标识,而应该自己派发一个 session 登录态(请参考登录时序图)。对于开发者自己生成的 session,应该保证其安全性且不应该设置较长的过期时间。session 派发到小程序客户端之后,可将其存储在 storage ,用于后续通信使用。

登录时序图

微信小程序获取用户信息并保存登录状态详解

从上图可以看出。当我们通过wx.login()获取code的后,发送给我们的服务器,然后去请求微信服务器换取得到对应的openid与session_key,openid是该用户在小程序中的唯一标识用于模板通知之类的。session_key就是用来解密用户的敏感信息。unionid之类的。unionid是微信用户在所有微信平台下的唯一标识。下面我会讲解一下如何得到。

微信小程序获取用户信息并保存登录状态详解

以上就是我的实现方法。调用wx.login()得到code后请求服务器获取openid与session_key缓存在服务器当中。其中生成一个随机数为key,value为openid与session_key。然后返回到小程序通过wx.setStorageSync('LoginSessionKey',得到的随机数key)缓存在小程序当中。每当我们去请求服务器时带上LoginSessionKey即可给服务器读取从而判断用户是否在登录。是不是很简单呢?

二、用户数据的加解密

通过wx.login()登录之后。我们可以通过wx.getUserInfo()获取用户信息。其中一些不敏感的信息在返回的 result中的userInfo里。如想要获取敏感信息。openid,unionid之类的。则需要从密文中去解密得到。

而密文则在encryptedData这个字段当中。我们去请求我们服务器去解密然后得到敏感信息后则可以保存起来。

加密数据解密算法

接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
  2. 对称解密的目标密文为 Base64_Decode(encryptedData),
  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节
  4. 对称解密算法初始向量 iv 会在数据接口中返回。

微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。

这时候我们通过小程序得到的result.encryptedData与result.iv与后端得到的session_key 解密出我们得到的敏感用户信息了。

官方给出的解密文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html

以上所述是小编给大家介绍的微信小程序获取用户信息并保存登录状态详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jquery中获取id值方法小结
Sep 22 Javascript
使用JQuery库提供的扩展功能实现自定义方法
Sep 09 Javascript
JavaScript获取按钮所在form表单id的方法
Apr 02 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
Oct 19 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
Jan 01 Javascript
浅谈JavaScript 浏览器对象
Jun 03 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
Jun 24 Javascript
webix+springmvc session超时跳转登录页面
Oct 30 Javascript
ztree实现权限横向显示功能
May 20 Javascript
jQuery实现键盘回车搜索功能
Jul 25 jQuery
javscript 数组扁平化的实现
Feb 03 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
May 20 Javascript
jsonp实现百度下拉框功能的方法分析
May 10 #Javascript
微信小程序用户授权,以及判断登录是否过期的方法
May 10 #Javascript
利用es6 new.target来对模拟抽象类的方法
May 10 #Javascript
Angular4.0动画操作实例详解
May 10 #Javascript
Angular 2使用路由自定义弹出组件toast操作示例
May 10 #Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
May 10 #Javascript
vue 实现搜索的结果页面支持全选与取消全选功能
May 10 #Javascript
You might like
让PHP支持页面回退的两种方法
2008/01/10 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
2016/03/21 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
犀利的js 函数集合
2009/06/11 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
vue图片加载失败时用默认图片替换的方法
2019/08/29 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
python访问抓取网页常用命令总结
2017/04/11 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
Python函数装饰器实现方法详解
2018/12/22 Python
【python】matplotlib动态显示详解
2019/04/11 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
python中for in的用法详解
2020/04/17 Python
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
美国批发供应商:Kole Imports
2019/04/10 全球购物
什么是数据库锁?Oracle中都有哪些类型的锁?
2015/08/21 面试题
20年同学聚会感言
2014/02/03 职场文书
运动会开幕式主持词
2014/03/28 职场文书
鲁迅故居导游词
2015/02/05 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android