登录流程完整小白解析(小程序 & Web)

在开发中,登录是每个系统最基础的功能。为了让小白也能理解,我们用通俗类比和流程讲解 小程序登录Web 登录Token 刷新安全存储等整个过程。


1️⃣ 小程序登录流程(小白理解版)

前提条件

  • 用户必须使用 微信小程序
  • 后端能存储用户信息并生成登录凭证(token/session)

类比:用户手机是身份证,后端生成登录态就像给用户发门禁卡。

流程步骤

  1. 前端调用 wx.login() 获取 code
wx.login({success(res) {if(res.code) {// 将 code 发送给后端}}
})
code 是临时凭证,只能交给后端换 token前端不能直接用它拿手机号或者用户信息类比:code = 临时通行证,交给门卫换门禁卡后端换取 session_key + openid后端调用微信接口得到 session_key(解密用)和 openid(用户唯一标识)保存到数据库,生成自己的 token 返回前端类比:openid = 用户身份证号,token = 门禁卡前端保存 token 并请求接口token 存储在小程序本地 storage每次请求接口都带上 tokentoken 过期后可自动重新登录类比:门禁卡过期,自动去门卫换新卡,用户几乎无感

2️⃣ Web 登录流程(小白理解版)
前提条件
用户用浏览器访问 Web 系统

后端有用户账号数据库

后端能生成 短期 Access Token 和 长期 Refresh Token

流程步骤
用户输入账号 + 密码

前端 HTTPS 发送给后端

后端验证账号密码(密码必须哈希 + 加盐存储)

类比:账号密码 = 身份证 + 密码锁

后端生成登录凭证

Access Token(短期有效,例 15 分钟)

Refresh Token(长期有效,例 30 天)

返回给前端存储(HttpOnly Cookie 或内存)

类比:Access Token = 临时门禁卡
Refresh Token = 长期凭证

前端请求接口

请求带 Access Token

Access Token 过期 → 后端返回 401

使用 Refresh Token 刷新 Access Token

javascript
复制代码
fetch(‘/refresh-token’, {
method: ‘POST’,
credentials: ‘include’ // 自动带上 HttpOnly Cookie
})
.then(res => res.json())
.then(data => {
console.log(‘新的 Access Token:’, data.accessToken);
})
后端验证 Refresh Token:

有效 → 返回新的 Access Token

过期 → 用户必须重新登录

类比:门禁卡失效,用长期凭证换新门禁卡;长期凭证过期 → 重新办理身份证

3️⃣ Token 存储方式(小白版)
存储方式 优点 风险 小白理解
Cookie (HttpOnly) 自动带请求,JS 不能读取 可能被 CSRF 攻击,需要防护 门禁卡放在门卫柜子里,别人拿不到,很安全
localStorage 前端可直接读取 XSS 风险高,脚本可访问 门禁卡放口袋里,别人可能偷看
sessionStorage 页面关闭自动清空 XSS 风险高,无法跨页面 门禁卡只在当前页面有效,关闭就没了

建议:Access Token 尽量存在内存或 HttpOnly Cookie,避免 localStorage 存敏感 token

4️⃣ 登录安全小贴士(小白理解)
密码安全

哈希 + 加盐存储

即便数据库泄露,也无法轻易破解密码

类比:把密码变成只有后端能解的密码锁

增加验证

可以加验证码或者二步验证

提高安全性,防止别人盗号

小程序体验

自动登录,不用每次输入账号密码

微信授权安全又方便

Web 体验

双 token 机制(Access + Refresh)

用户几乎感觉不到刷新过程

小白理解:

安全和体验要平衡

短期 token 保证安全

长期 token 保证用户不用频繁登录

5️⃣ 总结(小白理解)
小程序:wx.login → 后端换 token → 前端存 token → 自动续期

Web:账号密码 → 后端生成 Access + Refresh → 前端存储 → Access Token 过期 → Refresh Token 自动换新

核心:前端拿凭证 → 后端验证 → 生成登录态 → 前端请求接口

用户体验流畅,数据安全

类比回顾:

Access Token = 临时门禁卡

Refresh Token = 长期凭证

session_key = 后端钥匙

用户感觉不到加密解密和刷新过程,安全又顺畅

flowchart TD
subgraph 小程序登录
A1[用户点击登录] --> B1[调用 wx.login() 获取 code]
B1 --> C1[前端发送 code 给后端]
C1 --> D1[后端用 code 换取 session_key + openid]
D1 --> E1[生成自定义 token 返回前端]
E1 --> F1[前端存储 token (storage)]
F1 --> G1[前端请求接口,带 token]
G1 --> H1{token 过期?}
H1 – 否 --> I1[接口返回数据,用户看到正常信息]
H1 – 是 --> J1[自动重新登录获取新 token]
J1 --> F1
end

subgraph Web 登录A2[用户输入账号+密码] --> B2[前端发送给后端]B2 --> C2[后端验证账号密码]C2 --> D2[生成 Access Token + Refresh Token 返回前端]D2 --> E2[前端存储 Access Token (内存/HttpOnly Cookie)]D2 --> F2[前端存储 Refresh Token (HttpOnly Cookie)]E2 --> G2[前端请求接口,带 Access Token]G2 --> H2{Access Token 过期?}H2 -- 否 --> I2[接口返回数据,用户看到正常信息]H2 -- 是 --> J2[前端用 Refresh Token 请求刷新接口]J2 --> K2{Refresh Token 过期?}K2 -- 否 --> L2[后端返回新 Access Token]L2 --> E2K2 -- 是 --> M2[用户必须重新登录]M2 --> A2
endstyle 小程序登录 fill:#E8F0FE,stroke:#1E90FF,stroke-width:1px
style Web 登录 fill:#FFE8E8,stroke:#FF4500,stroke-width:1px

小程序直接单token就可以,每次请求都携带,请求过去过期了,返回401,在请求登录获取code,获取新的就可以了,web因为要输入账户密码所以,得搞双token,不然不操作一会就重新登陆,但是单token也行设置一小时不登录退出即可

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装vcenter6.7 第二阶段安装很慢 或卡在50%

DNS、FQDN配置的问题采用VCSA安装vCenter时,第一步安装还算顺利,第二步就会安装失败,而且还特别慢,这是因为部署时需要DNS服务器,下面就是不采用DNS服务器的部署方案。第一步:正常安装,DNS就写本…

第十六届蓝桥杯软件赛 C 组省赛 C++ 题解

大家好,今天是 2025 年 9 月 11 日,我来给大家写一篇关于第十六届蓝桥杯软件赛 C 组省赛的C 题解,希望对大家有所帮助!!! 创作不易,别忘了一键三连 题目一:数位倍数 题目链接&…

项目帮助文档的实现

项目帮助文档的实现 代码如下&#xff1a; #ifndef __M_HELPER_H__ #define __M_HELPER_H__ #include <iostream> #include <fstream> #include <string> #include <vector> #include <sqlite3.h> #include <random> #include <sstream…

python逆向-逆向pyinstaller打包的exe程序反编译获取源代码

python逆向-逆向pyinstaller打包的exe程序反编译获取源代码 Pyinstaller pyinstaller 是一个用于将 Python 程序打包成独立可执行文件的工具&#xff0c;能够在没有 Python 解释器的情况下运行。 Python 脚本转换为 Windows、macOS 和 Linux 操作系统上的可执行文件。 把Python…

【SQL】-- sql having 和 where 的 区别

HAVING 和 WHERE 都是用来筛选数据的&#xff0c;但它们的应用场景有所不同。WHERE&#xff1a;用于筛选行数据&#xff0c;通常在 FROM 子句之后执行。它在分组操作 (GROUP BY) 之前应用&#xff0c;用来筛选出符合条件的记录。示例&#xff1a;SELECT name, age FROM employe…

MySQL,SQL Server,PostgreSQL三种数据库各自的优缺点,分别适用哪些场景

MySQL的优缺点及适用场景优点开源免费&#xff0c;社区版可商用&#xff0c;成本低。轻量级&#xff0c;安装配置简单&#xff0c;适合中小型项目。读写性能优异&#xff0c;尤其在OLTP&#xff08;在线事务处理&#xff09;场景下表现突出。支持主从复制、分片等扩展方案&…

Java 类加载机制双亲委派与自定义类加载器

我们来深入解析 Java 类加载机制。这是理解 Java 应用如何运行、如何实现插件化、以及解决一些依赖冲突问题的关键。一、核心概念&#xff1a;类加载过程一个类型&#xff08;包括类和接口&#xff09;从被加载到虚拟机内存开始&#xff0c;到卸载出内存为止&#xff0c;它的整…

Kaggle项目实践——Titanic: Machine Learning from Disaster

泰坦尼克号沉船事件是机器学习领域最经典的入门项目之一。Kaggle 上的 Titanic: Machine Learning from Disaster 竞赛&#xff0c;被无数人称为“机器学习的 Hello World”。 一、数据导入与清洗&#xff1a;让数据从 “杂乱” 变 “干净” 机器学习模型就像 “挑食的孩子”…

Qt C++ 复杂界面处理:巧用覆盖层突破复杂界面处理难题​之二

接上一篇&#xff0c;继续探索“覆盖层”的使用方法。 五、覆盖层进阶交互&#xff1a;从 “能绘制” 到 “好操作”​ 基础的绘制功能只能满足 “看得见” 的需求&#xff0c;实际开发中还需要 “能操作”—— 比如选中线条修改颜色、按 Delete 键删除线条、鼠标 hover 时高亮…

神经网络构成框架-理论学习

一、神经网络的基本组成与分类 1.1 神经网络的核心组成部分 神经网络是现代人工智能的基石&#xff0c;其设计灵感来源于生物神经系统的信息处理方式。作为工程师&#xff0c;了解神经网络的基本组成部分对于构建和优化模型至关重要。一个典型的神经网络主要由以下几个关键部分…

从0开始开发app(AI助手版)-架构及环境搭建

架构选择 前端React Native 后端Firebase 原因 环境准备 安装node 安装JDK 命令行工具&#xff1a;Node.js command prompt命令行查询Javav版本&#xff1a;javac -version使用nrm工具切换淘宝源&#xff1a;npx nrm use taobao安装yarn&#xff0c;替代npm下载工具&#x…

【性能测试】Jmeter工具快速上手-搭建压力测试脚本

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 概念 性能测试是软件测试的重要分支&#xff0c;核心目标是通过模拟真实业务场景和负载压力&#xff0c;评估系统在不同条件下的性能表现&#xff0c;发现系统性…

oracle里的int类型

oracle里的int类型 在 ANSI SQL 标准 中&#xff0c;INTEGER 和 SMALLINT 是定义好的精确数值类型&#xff0c;但它们的 “长度”或“大小”并不是通过 (N) 括号来指定的&#xff08;如 INT(4)&#xff09;&#xff0c;这一点与 MySQL 等数据库的非标准扩展完全不同。 SMALLI…

前端学习之后端java小白(二)-sql约束/建表

一、约束SQL约束&#xff08;Constraints&#xff09;是用于限制表中数据的规则&#xff0c;确保数据的完整性和准确性。以下是主要的SQL约束类型&#xff1a; 主要约束类型&#xff1a; 1. NOT NULL 约束: 确保列不能包含空值 CREATE TABLE users (id INT NOT NULL,name VARC…

OpenCV:图像金字塔

文章目录一、什么是图像金字塔&#xff1f;二、图像金字塔的核心操作&#xff1a;采样与逆采样1. 向下采样&#xff08;pyrDown&#xff09;&#xff1a;从高分辨率到低分辨率步骤1&#xff1a;高斯滤波步骤2&#xff1a;删除偶数行与偶数列OpenCV实战代码效果特点2. 向上采样&…

LVS与Keepalived详解(一)负载均衡集群介绍

文章目录前言一、什么是LVS&#xff1f;二、四层&#xff08;L4&#xff09;负载均衡的最佳解决方案是什么&#xff1f;2.1解决方案分类与对比&#xff08;负载均衡的三种方式介绍&#xff09;2.1.1 硬件负载均衡 (Hardware Load Balancer)2.1.2 软件负载均衡 (Software Load B…

消息队列-kafka完结

基本概念和操作 基本概念 简单概念:::color4 Broker&#xff1a;如果将kafka比喻成数据仓库网络&#xff0c;那么Broker就是网络中的仓库节点&#xff0c;比如快递站&#xff0c;在该节点内可以独立运行&#xff0c;并且多个Broker可以连接起来&#xff0c;构建kafka集群Topic&…

Chromium 138 编译指南 Windows篇:环境变量配置与构建优化(三)

引言配置&#xff0c;往往决定成败。在软件开发的世界里&#xff0c;环境变量就像是一位无声的指挥家&#xff0c;默默地协调着各个组件的协同工作。对于Chromium 138这样一个拥有数千万行代码的超大型项目而言&#xff0c;正确的环境变量配置更是编译成功的关键所在。也许您曾…

LabVIEW加载 STL 模型至 3D 场景 源码见附件

LabVIEW 中 STL 模型的导入与 3D 场景显示&#xff0c;基于示例代码逻辑&#xff0c;结合格式兼容性、功能实现步骤及多样化显示方式&#xff0c;适用于三维可视化温控、机械零件模拟等场景。 1示例代码 NI 社区案例 “Add an STL file to 3D scene using LabVIEW” 提供了经…

硅基计划3.0 Map类Set类

文章目录一、二叉搜索树&#xff08;排序树&#xff09;1. 概念初识2. 模拟实现1. 创建搜索树节点2. 查找指定元素是否存在3. 插入4. 删除二、Map类1. put——设置单词以及其频次2. get——获取单词频次3. getOrDefault——获取单词频次或返回默认值4. remove——删除单词频次信…