热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

这篇文章主要介绍了微信用户访问小程序的登录过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

概述

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

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

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

这里写图片描述

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

小程序接口介绍

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进行比对,如果相等,则校验通过。

总结

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

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


推荐阅读
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文探讨了在不同场景下如何高效且安全地存储Token,包括使用定时器刷新、数据库存储等方法,并针对个人开发者与第三方服务平台的不同需求提供了具体建议。 ... [详细]
  • 优雅地记录API调用时长
    本文旨在探讨如何高效且优雅地记录API接口的调用时长,通过实际案例和代码示例,帮助开发者理解并实施这一技术,提高系统的可观测性和调试效率。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 本项目使用Java语言开发了一个基于B/S架构的指纹识别系统,该系统能够实现指纹的高效采集与精准识别,适用于多种安全认证场景。 ... [详细]
  • 为什么会崩溃? ... [详细]
  • 前端技术分享——利用Canvas绘制鼠标轨迹
    作为一名前端开发者,我已经积累了Vue、React、正则表达式、算法以及小程序等方面的技能,但Canvas一直是我的盲区。因此,我在2018年为自己设定了一个新的学习目标:掌握Canvas,特别是如何使用它来创建CSS3难以实现的动态效果。 ... [详细]
  • iOS 小组件开发指南
    本文详细介绍了iOS小部件(Widget)的开发流程,从环境搭建、证书配置到业务逻辑实现,提供了一系列实用的技术指导与代码示例。 ... [详细]
  • 探讨在iOS客户端向服务器上传数据流的过程中,若服务器因权限校验失败而未接收流直接响应时,如何有效避免客户端出现超时的问题。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 本文深入探讨了微信小程序直播中点赞动画的实现方法,特别是如何利用三阶贝塞尔曲线使点赞图标沿预设路径移动,以及相关的数学计算与代码实现。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 本文探讨为何Request对象的外观设计被认为是精妙的,重点在于其如何利用门面模式确保数据安全,同时保持系统的高效交互。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
author-avatar
嘿听tj说你是被搞出来的
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有