微信小程序登录的最佳实践

news2024/11/24 2:08:38

微信小程序登录的最佳实践

官方文档的介绍

小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。

登录流程时序

在这里插入图片描述

说明

调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号) 和 会话密钥 session_key。
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

注意事项

会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。
临时登录凭证 code 只能使用一次

实际应用

那么在实际的项目中我们是怎么实现登录的呢?

常见的一种做法是自己做一个表单,要求客户输入用户名和密码。当用户提交表单后,将这些数据加密后传递给后端,后端解密后将数据存放到数据库中。在这种方法中,用户名就是用户的唯一标识(前提是设置了用户名是唯一字段)。

显然,在实际应用中,很多时候用户是有相同的用户名的,所以这种方法存在缺陷。因此我们使用微信官方提供的登录能力去获取微信提供的用户身份标识,这有助于快速建立小程序内的用户体系。

首先,我先解释一下微信官方展示的登录流程时序图

  1. 调用 wx.login() 获取 临时登录凭证code ;

    wx.login({
    	success: (res) => {
    		console.log(res.code);
    	}
    })
    

    微信官方文档wx.login接口的说明

  2. 拿到这个code之后,我们发起一个请求去访问 auth.code2Session 接口,代码如下:

    wx.request({
        url: "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code",
        method: 'POST',
        data: {
          code: code //登录凭证code
        },
        header: {
          'content-type': 'application/json;charset=UTF-8'
        },
        success: (res) => {
    		console.log(res);
        	//获取到sessionKey,openid,unionid...
    	}
    })
    
    • 这里的appid,即为你小程序的appid,可以去微信公众平台查看

在这里插入图片描述

  • 这里的secret,即为你小程序的秘钥,也是在微信公众平台查看(出于安全考虑,AppSecret不再被明文保存,忘记密钥需点击重置)

  • 这里的code,即为你第一步中调用wx.login()返回的code

​ 如果访问成功,则会返回如下字段

在这里插入图片描述

​ 微信官方文档code2Session接口的说明

那么拿到这些数据之后,如果你是使用了服务器的,你可以像这篇博客一样,自定义登录态(生成一个token)。

因为我在开发中使用了云开发,这里我讲述一下我是如何处理的。

1.首先我在云数据库创建了一张名为user的表

2.在前端的js代码中调用Collection.add()方法添加数据,同时将用户数据存储到本地缓存中

wx.request({
    url: "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code",
    method: 'POST',
    data: {
      code: code //登录凭证code
    },
    header: {
      'content-type': 'application/json;charset=UTF-8'
    },
    success: (res) => {
		let orginData = {
          nickName: "xxx"
          avatarUrl: 'cloud://xxx.jpg',  //存储在云存储的图片资源
        }
        orginData['session_key'] = res.data.session_key;
        orginData['openid'] = res.data.openid;
        let userInfo = orginData;
        wx.cloud.database().collection('user')
            .add({
              data: userInfo
            })
            .then(res => {
              console.log('创建新用户信息成功', res)
              //刷新userInfo缓存
              wx.setStorageSync('userInfo', userInfo);
            })
            .catch(err => {
              console.log('创建新用户信息失败', err)
            })
    }
})

那么如何判断登录态是否过期,这里微信提供了另外一个接口:wx.checkSession

部分代码如下:

wx.checkSession({
  success () {
    //session_key 未过期,并且在本生命周期一直有效
  },
  fail () {
    // session_key 已经失效,需要重新执行登录流程
    //重新登录,然后更新数据库和本地缓存
    wx.login({
        success: (res) => {
            wx.request({
    		url: "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code",
    		method: 'POST',
    		data: {
      			code: code //登录凭证code
    		},
            header: {
              'content-type': 'application/json;charset=UTF-8'
            },
            success: (res) => {
                let user = wx.getStorageSync('userInfo');
                user['session_key'] = res.data.session_key;
                wx.setStorageSync('userInfo', user);
                wx.cloud.database().collection('user').where({
                    _openid: user['_openid']
                  })
                  .update({
                    data: {
                      session_key: user['session_key']
                    },
                  })
    		}
		})
        },
        fail:(err)=>{
        	console.log(err);
	    }
    })
  }
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图解C++对象模型

C对象模型是什么 《深度探索C对象模型》这本书中对对象模型的描述如下: 有两个概念可以解释C对象模型: 语言中直接支持面向对象程序设计的部分。 对于各种支持的底层实现机制。 语言中直接支持面向对象程序设计的部分,包括了构造函数、析构函…

chatgpt赋能python:Python如何快速复制上一行?

Python 如何快速复制上一行? 在编写Python代码时,经常需要快速复制上一行代码进行修改。如果只是简单的手动复制粘贴,会造成不必要的时间浪费并且容易出错。本文将介绍三种快速复制上一行代码的方法。 方法一:使用快捷键 在Pyt…

chatgpt赋能python:Python如何拟合曲线

Python如何拟合曲线 拟合曲线是数据分析中常见的一种方法。Python作为一种强大的编程语言,具有丰富的数据分析库和拟合曲线的功能。本文将介绍如何在Python中使用numpy、matplotlib和scipy库进行曲线拟合。 numpy库 numpy是Python中常用的数值计算库。它提供了许…

Error系列-CVE CIS-2023系统漏洞处理方案集合

问题1: CVE-2023-29491 Type: OS涉及到的包:ncurses-dev,ncurses-libs,ncurses-terminfo-base描述:当前系统安装的ncurses,存在漏洞,当被setuid应用程序使用时,允许本地用户通过在$HOME/中找到的终端数据库…

Spring Cloud Alibaba - Sentinel(二)

目录 一、Sentinel 熔断降级简介 1、基本介绍 2、熔断策略 3、熔断规则 二、Sentinel熔断策略 1、慢调用比例 2、异常比例 3、 异常数 三、热点规则 1、热点规则 2、参数例外项 四、系统规则 1、Sentinel 系统规则 一、Sentinel 熔断降级简介 1、基本介绍 除了流…

Linux 手动部署 SpringBoot 项目

Linux 手动部署 SpringBoot 项目 1. 将项目打包成 jar 包 &#xff08;1&#xff09;引入插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></pl…

【Spring 项目的创建和使用】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. 创建 Spring 项目 2. 创建一个 普通 Maven…

chatgpt赋能python:Python如何更新pip

Python 如何更新 pip 在 Python 编程中&#xff0c;pip 是一个非常重要的工具&#xff0c;它可以帮助我们安装和管理 Python 包。然而&#xff0c;我们有时候会遇到 pip 版本过低&#xff0c;需要进行更新的情况。那么&#xff0c;如何更新 pip 呢&#xff1f; 什么是 pip p…

论文笔记(三十):Counter-Hypothetical Particle Filters for Single Object Pose Tracking

Counter-Hypothetical Particle Filters for Single Object Pose Tracking 文章概括摘要1. 简介II. 相关工作A. 机器人的物体姿态估计和跟踪B. 鲁棒性的粒子滤波 III. 背景&#xff1a;粒子滤波A. 粒子滤波B. 粒子剥夺和粒子重振IV. 反假设粒子滤波A. 反假设重取样B. 6D姿势估计…

记一次为学校流浪猫开发的小程序——航海之猫

某次刷朋友圈时&#xff0c;看到校园墙上有一个校园流浪猫救助组织在召集爱心人士加入工作小组。其中需要会做微信小程序的给学校里的猫猫做一个猫猫图鉴&#xff0c;于是就有了本次项目经历。 相关技术及工具 工具&#xff1a;Uniapp、XBuilder、微信官方开发者工具技术&…

chatgpt赋能python:Python如何把文件复制到另一个目录下

Python如何把文件复制到另一个目录下 作为一个有着10年Python编程经验的工程师&#xff0c;我可以告诉你&#xff0c;在Python编程中&#xff0c;复制文件是非常常见的任务之一。无论您是为了备份数据或将文件从一个地方传输到另一个地方&#xff0c;都需要使用文件复制操作。…

Linux中/dev/null和/dev/zero的作用

1./dev/null和/dev/zero介绍 在Linux环境中&#xff0c;我们会经常用到/dev/null和/dev/zero&#xff0c;今天为大家讲讲/dev/null和/dev/zero的作用以及使用场景。 1.1./dev/null介绍 linux中/dev/null&#xff0c;它是一种特殊的虚拟设备&#xff0c;用于写入而不是读取&a…

前端050_单点登录SSO_登录功能实现

登录功能实现 1、登录认证流程2、定义 Api 调用登录接口3、Vuex 登录信息状态管理4、提交登录触发 action5、测试1、登录认证流程 单点登录认证流程图 门户客户端要求登录时,输入用户名密码,认证客户端提交数据给认证服务器认证服务器校验用户名密码是否合法,合法响应用户…

RISC-V学习基础(六)

原子指令 RV32A有两种类型的原子操作&#xff1a; 内存原子操作&#xff08;AMO&#xff09;加载保留/条件存储&#xff08;load reserved/store conditional&#xff09; 图6.1是RV32A扩展指令集的示意图&#xff1a; 图6.2列出了它们的操作码和指令格式 AMO&#xff08;at…

chatgpt赋能python:Python如何更新包

Python如何更新包 Python是当今最流行的编程语言之一&#xff0c;它通过其丰富的生态系统和充足的工具库为许多开发者提供了便捷、快速、高效的开发体验。在Python的世界里&#xff0c;包是一种最重要的组件之一&#xff0c;因为它们可以让你轻松地扩展Python的功能&#xff0…

【跨域】如何解决跨域问题

同源策略 同源 相同协议相同域名相同端口 内容 浏览器的同源策略 - Web 安全 | MDN (mozilla.org) 浏览器页面向不同源的服务器发送ajax请求资源时&#xff0c;响应的数据会被浏览器拦截 意义 出于安全性的考虑&#xff0c;防止恶意获取数据 解决方案 JSONP 不使用aj…

Rust每日一练(Leetday0022) 最小路径和、有效数字、加一

目录 64. 最小路径和 Minimum Path Sum &#x1f31f;&#x1f31f; 65. 有效数字 Valid Number &#x1f31f;&#x1f31f;&#x1f31f; 66. 加一 Plus One &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 P…

docker水位如何清理(容器水位清理详细分析)

docker水位过高&#xff0c;清理怕出问题&#xff1f;&#xff0c;不知道清理什么&#xff1f;怕删错了&#xff1f;进入实践 第一步准备测试数据 创建 悬空的镜像&#xff08;即REPOSITORY和TAG均为的镜像&#xff09; docker pull busybox:musl docker tag busybox:musl b…

chatgpt赋能python:Python的更新:为什么你需要及时更新并如何更新

Python的更新&#xff1a;为什么你需要及时更新并如何更新 Python是一种强大的程序设计语言&#xff0c;它具有广泛的应用&#xff0c;从数据科学&#xff0c;机器学习到Web开发&#xff0c;都有着广泛的应用。不断更新的Python版本为开发者和用户提供了最新的功能和最佳实践。…