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


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 相关文章推荐
document.all与WEB标准
May 13 Javascript
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
Jul 14 Javascript
jquery获取tr并更改tr内容示例代码
Feb 13 Javascript
Linux下使用jq友好的打印JSON技巧分享
Nov 18 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
May 20 Javascript
javascript实现拖动元素交换位置
Nov 29 Javascript
jquery+json实现分页效果
Mar 07 Javascript
JavaScript数据结构链表知识详解
Nov 21 Javascript
javascript 利用arguments实现可变长参数
Nov 21 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
Dec 05 Javascript
react.js 获取真实的DOM节点实例(必看)
Apr 17 Javascript
JS表单传值和URL编码转换
Mar 03 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
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
php判断访问IP的方法
2015/06/19 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
ClearTimeout消除闪动实例代码
2016/02/29 Javascript
jQuery中的基本选择器用法学习教程
2016/04/14 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
2017/02/22 Javascript
在 Angular 中实现搜索关键字高亮示例
2017/03/21 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
js中url对象化管理分析
2017/12/29 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
使用Python轻松完成垃圾分类(基于图像识别)
2019/07/09 Python
Python Collatz序列实现过程解析
2019/10/12 Python
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
Python读写锁实现实现代码解析
2020/11/28 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
HTML5之HTML元素扩展(上)—新增加的元素及使用概述
2013/01/31 HTML / CSS
澳大利亚百货公司:David Jones
2018/02/08 全球购物
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
分别介绍一下Session Bean和Entity Bean
2015/03/13 面试题
计算机专业优秀大学生自我总结
2014/01/21 职场文书
开学典礼主持词
2014/03/19 职场文书
2014年连锁店圣诞节活动方案
2014/12/09 职场文书
降价通知函
2015/04/23 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书