# 小程序 Web 登錄流程完整解析

登錄流程完整小白解析(小程序 & 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——刪除單詞頻次信…