微信用户访问小程序的登录过程详解


Posted in Javascript onSeptember 20, 2019

概述

当你开发完了一个小程序并部署上线后,某个微信用户第一次访问这个小程序的时候,会弹出一个授权界面,用户可以选择是否使用微信登录,如果选择是,则直接进入到小程序。当你第二次进入该小程序的时候,你会发现授权界面不会弹出来了,直接就进入小程序了。

这个过程看起来非常的简单,但其实实现起来相当的麻烦和繁琐。涉及到会话、安全、验证等各种各样的问题。下面笔者介绍一下实现这个登录过程的思路。

微信提供小程序登录流程图

微信用户访问小程序的登录过程详解

我们可以从登录流程时序 找到这张图。想完全看懂张图,需要了解很多东西。我们先来看看微信提供的几个接口。

小程序接口介绍

wx.login()

这个方法是小程序端发起的,如果是使用腾讯团队推出的小程序组件化开发框架的wepy的话,伪代码如下:

wepy.login()
   .then(res => {
   const code = res.code
 })

这样子就可以从微信平台获取一个code,这个code是临时登录凭证,用于获取openid的。

wx.request()

这个也是小程序端发起的,用于请求开发者服务器(也即是我们的应用服务器)上的接口,调用的伪代码如下:

wepy.request({
     url: `xxurl`,
     data: {
     //入参
     },
    })
    .then(res => {
     //从res中获取应用服务器返回的数据
    })

获取openid的接口

当某个开发主体开发了一个小程序后,当用户访问这个小程序的时候,微信平台会为这个用户分配一个openid。如下接口:

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

这个微信接口一般是我们的应用服务器发起调用的,而不是小程序端发起的。

wx.getUserInfo

getUserInfo这个接口用于在微信平台获取用户信息。注意,如果微信用户第一次访问小程序,是弹出一个授权界面的。当用户授权后,getUserInfo才能调用并返回用户数据。

这个四个接口在使用微信访问小程序的时候都会用到的。

基于token保持会话和登录认证

小程序虽然不支持cookie的机制,但是支持在header里设置token。

这个token是应用服务器生成的。

header: {
    'xxxxtoken': token,
 }

当小程序调用应用服务器接口的时候,必须带上这个token,应用服务端则对这个token进行解析和认证。当然如果是第一次访问小程序,只能由应用服务器先生成token。 笔者打算用伪代码来表达使用token后,整个登录的过程,因为用文字或者图比较难表达。

const code = wx.login();
if (code ) {//code存在
//从小程序的本地中获取toten
const token = wx.getStorageSync('xxxxxtoken')
   if (token ) {//小程序本地存有token,无需弹出授权界面
    //直接传入code字段,调用应用服务器的验证token的方法,如果校验成功,需要返回用户信息。
    const userinfo = wx.request(http://xxxxxValidateToken(code ));
    if (userinfo) {
      //说明登录成功,直接进入小程序的主界面。
    }
   }
   else {
    //说明小程序本地没有token,这个时候需要弹出授权界面,让微信用户决定是否访问小程序,如果用户选择是的话。
    const weixinuserinfo = wx.getUserInfo();//会弹出授权界面,微信提供的
    if (weixinuserinfo ){
      //生成或者验证token
      const userinfo = wx.request(http://xxxxxValidateToken(code ));

     const token = userinfo.getToken();
     //将token存储到小程序本地
     wx.setStorageSync('xxxxxtoken', token )
    }
   }    
}

上面的伪代码中,会调用应用服务器(我们的应用服务器)的

http://xxxxxValidateToken(code )

方法。这个方法的实现逻辑大概如下:

1、先验证这个微信用户是否存在,可以调用微信提供的jscode2session方法,该方法会返回一个openid。我们必须在业务代码里,将这个openid保存到数据库,并和userid关联起来。

2、判断是否是新的用户,如果是,则生成token和生成新的一个用户信息存储到数据库。如果不是新的用户,则验证token。

这个流程走完后,小程序就可以通过wx.request方法,带上token,真正的访问应用服务器的业务方法,获取业务数据。

token的生成和校验

见过有些公司是直接将userid和openid,加密后返回给小程序。也见过用userid和password加密后返回给小程序。如果是选择第二种方式的话,验证token的逻辑大概如下:

先解密,获取userid和password,并根据userid从数据库中获取到用户密码,跟从token中解密出来的password进行比对,如果相等,则校验通过。

总结

现在再回头看看微信提供登录路程图,是否好理解一些了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
setTimeout的延时为0时多个浏览器的区别
May 23 Javascript
实例讲解jquery与json的结合
Jan 07 Javascript
深入理解JS中的substr和substring
Apr 26 Javascript
jquery实现图片列表鼠标移入微动
Dec 01 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
Mar 24 jQuery
ES6新特性之字符串的扩展实例分析
Apr 01 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
Mar 09 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
Jun 25 Javascript
vue组件间的参数传递实例详解
Apr 26 Javascript
VUE兄弟组件传值操作实例分析
Oct 26 Javascript
JS实现小星星特效
Dec 24 Javascript
JS面向对象实现飞机大战
Aug 26 Javascript
解决layUI的页面显示不全的问题
Sep 20 #Javascript
小程序如何获取多个formId实现详解
Sep 20 #Javascript
SSM+layUI 根据登录信息显示不同的页面方法
Sep 20 #Javascript
使用Layui搭建后台管理界面的操作方法
Sep 20 #Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
Sep 20 #Javascript
小程序使用watch监听数据变化的方法详解
Sep 20 #Javascript
基于layui内置模块(element常用元素的操作)
Sep 20 #Javascript
You might like
利用PHP和AJAX创建RSS聚合器的代码
2007/03/13 PHP
PHP-redis中文文档介绍
2013/02/07 PHP
smarty内置函数section的用法
2015/01/22 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
快速处理vue渲染前的显示问题
2018/03/05 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
pycharm 使用心得(四)显示行号
2014/06/05 Python
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
2018/05/24 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
公务员职务工作的自我评价
2013/11/01 职场文书
银行介绍信范文
2014/01/10 职场文书
追悼会子女答谢词
2014/01/28 职场文书
一年级小学生评语
2014/04/22 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技