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


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 相关文章推荐
Node.js实战 建立简单的Web服务器
Mar 08 Javascript
jQuery写的日历(包括日历的样式及功能)
Apr 23 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
Apr 16 Javascript
基于ajax实现文件上传并显示进度条
Aug 03 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
Nov 03 Javascript
AngularJS国际化详解及示例代码
Aug 18 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
Feb 03 Javascript
JavaScrpt判断一个数是否是质数的实例代码
Jun 11 Javascript
浅谈JavaScript作用域和闭包
Sep 18 Javascript
AngularJS动态添加数据并删除的实例
Feb 27 Javascript
详解Vue中的scoped及穿透方法
Apr 18 Javascript
使用Typescript和ES模块发布Node模块的方法
May 25 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
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
详解AngularJS中的filter过滤器用法
2016/01/04 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
基于js中document.cookie全面解析
2017/09/14 Javascript
tangram.js库实现js类的方式实例分析
2018/01/06 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
python中set()函数简介及实例解析
2018/01/09 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
通过Pandas读取大文件的实例
2018/06/07 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
Python实现最常见加密方式详解
2019/07/13 Python
简单了解django缓存方式及配置
2019/07/19 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
servlet面试题
2012/08/20 面试题
养殖行业的创业计划书
2014/01/05 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
黑白记忆观后感
2015/06/18 职场文书
2016庆祝教师节新闻稿
2015/11/25 职场文书
2016党员学习心得体会范文
2016/01/23 职场文书
新手开公司创业注意事项有哪些?
2019/07/29 职场文书