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


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 相关文章推荐
Javascript中valueOf与toString区别浅析
Mar 19 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
Jun 30 Javascript
javascript鼠标右键菜单自定义效果
Dec 08 Javascript
AngularJS Controller作用域
Jan 09 Javascript
简单实现js拖拽效果
Jul 25 Javascript
简单实现jQuery手风琴效果
Aug 18 jQuery
Angular利用trackBy提升性能的方法
Jan 26 Javascript
vue数组对象排序的实现代码
Jun 20 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
Oct 10 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
Mar 31 Javascript
react PropTypes校验传递的值操作示例
Apr 28 Javascript
Angular CLI发布路径的配置项浅析
Mar 29 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脚本的10个技巧(7)
2006/10/09 PHP
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
php字符串截取函数用法分析
2014/11/25 PHP
PHP钩子与简单分发方式实例分析
2017/09/04 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
javascript 类型判断代码分析
2010/03/28 Javascript
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
2016/08/19 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
NodeJs操作MongoDB教程之分页功能以及常见问题
2019/04/09 NodeJs
JS对日期操作封装代码实例
2019/11/08 Javascript
[01:02:32]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第二场 2月26日
2021/03/11 DOTA
python求pi的方法
2014/10/08 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
Pytorch GPU显存充足却显示out of memory的解决方式
2020/01/13 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
精彩自我鉴定
2014/01/16 职场文书
大学生2014全国两会学习心得体会
2014/03/10 职场文书
代办委托书怎样写
2014/04/08 职场文书
主题教育活动总结
2014/05/05 职场文书
三孔导游词
2015/02/05 职场文书