Node.js 中 Token 原理簡單介紹 + 示例代碼

目錄

? 什么是 Token?

🔁 原理簡述:

🧩 示例項目:使用 Node.js + jsonwebtoken 實現 Token 登錄驗證

📁 文件結構如下:

🔹 server.js(JavaScript)

🔸 index.html(HTML)

?? 程序運行說明

? 總結


?

? 什么是 Token?

Token 是一種用于身份驗證的機制。常用于 Web 前后端分離的項目中,是一種 無狀態、基于令牌的認證方式

🔁 原理簡述:

  1. 用戶登錄成功后,服務器會生成一個 Token(令牌)返回給客戶端。

  2. 客戶端保存 Token(通常存儲在 localStorage 或 Cookie 中)。

  3. 每次請求時,客戶端把 Token 放在請求頭中發送給服務器。

  4. 服務器通過驗證 Token,判斷用戶是否有權限訪問資源。

Token 常用格式為 JWT(JSON Web Token),是一種將用戶信息加密后的字符串。


🧩 示例項目:使用 Node.js + jsonwebtoken 實現 Token 登錄驗證

📁 文件結構如下:

token-demo/
├── server.js         ← Node.js 主程序 (JavaScript)
└── index.html        ← 登錄頁面 (HTML)

🔹 server.js(JavaScript)

// server.js
const express = require('express');
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');
const path = require('path');const app = express();
const SECRET_KEY = 'my-secret-key'; // 密鑰用于加密和驗證Tokenapp.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static(__dirname));// 登錄接口,返回token
app.post('/login', (req, res) => {const { username, password } = req.body;if (username === 'admin' && password === '123456') {const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });res.send({ message: '登錄成功', token });} else {res.status(401).send({ message: '用戶名或密碼錯誤' });}
});// 受保護的接口,必須帶上token才能訪問
app.get('/protected', (req, res) => {const authHeader = req.headers.authorization;if (!authHeader) {return res.status(403).send({ message: '未提供Token' });}const token = authHeader.split(' ')[1];try {const decoded = jwt.verify(token, SECRET_KEY);res.send({ message: '訪問成功', user: decoded });} catch (err) {res.status(401).send({ message: 'Token無效或已過期' });}
});app.listen(3000, () => {console.log('服務器運行在 http://localhost:3000');
});

🔸 index.html(HTML)

<!-- index.html -->
<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>Token 登錄示例</title>
</head>
<body><h2>用戶登錄</h2><form id="loginForm">用戶名:<input type="text" id="username"><br>密碼:<input type="password" id="password"><br><button type="submit">登錄</button></form><button onclick="getProtected()">訪問受保護資源</button><script>let token = '';document.getElementById('loginForm').addEventListener('submit', async (e) => {e.preventDefault();const username = document.getElementById('username').value;const password = document.getElementById('password').value;const res = await fetch('/login', {method: 'POST',headers: { 'Content-Type': 'application/x-www-form-urlencoded' },body: new URLSearchParams({ username, password })});const data = await res.json();if (data.token) {token = data.token;alert('登錄成功,已獲得Token!');} else {alert(data.message);}});async function getProtected() {const res = await fetch('/protected', {headers: {'Authorization': 'Bearer ' + token}});const data = await res.json();alert(JSON.stringify(data));}</script>
</body>
</html>

?? 程序運行說明

  1. 安裝依賴:

npm install express jsonwebtoken body-parser
  1. 啟動服務器:

node server.js
  1. 在瀏覽器訪問:

http://localhost:3000
  1. 輸入用戶名:admin,密碼:123456 進行登錄。

  2. 登錄成功后點擊「訪問受保護資源」按鈕,后臺會驗證 Token 并返回用戶信息。


? 總結

  • 使用 jsonwebtoken 生成和驗證 Token。

  • Token 是無狀態的,不需要服務器保存用戶信息。

  • 用戶每次訪問受保護資源時都要攜帶 Token。

這種方式非常適合前后端分離項目的身份認證。


需要我幫你加個 JWT 結構圖、流程圖或者換個小白更好懂的說法也可以隨時說哈~想讓你的博客更有深度也沒問題!??

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77321.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77321.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77321.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

每日OJ_牛客_ruby和薯條_排序+二分/滑動窗口_C++_Java

目錄 ruby和薯條_排序二分/滑動窗口 題目解析 C代碼 Java代碼 ruby和薯條_排序二分/滑動窗口 ruby和薯條 描述&#xff1a; ruby很喜歡吃薯條。 有一天&#xff0c;她拿出了n根薯條。第i根薯條的長度為ai。 ruby認為&#xff0c;若兩根薯條的長度之差在l和r之間&#xf…

從 ComponentActivity 看 Android Activity 的演變與 Jetpack 架構融合

在 Jetpack Compose 出現后&#xff0c;開發者可能會注意到一個變化&#xff1a;項目的主 Activity 默認從過去熟悉的 AppCompatActivity 變成了 ComponentActivity。這個變化并非偶然&#xff0c;而是 Android 架構在向現代組件化演進過程中一個關鍵的轉折點。本文將圍繞 Comp…

Linux 防火墻( iptables )

目錄 一、 Linux 防火墻基礎 1. 防火墻基礎概念 &#xff08;1&#xff09;防火墻的概述與作用 &#xff08;2&#xff09;防火墻的結構與匹配流程 &#xff08;3&#xff09;防火墻的類別與各個防火墻的區別 2. iptables 的表、鏈結構 &#xff08;1&#xff09;規則表 …

大數據 - 2. Hadoop - HDFS(分布式文件系統)

前言 為什么海量數據需要分布式存儲技術&#xff1f; 文件過大時&#xff0c;單臺服務器無法承擔&#xff0c;要靠數量來解決。數量的提升帶來的是網絡傳輸、磁盤讀寫、CPU、內存等各方面的提升。 眾多的服務器一起工作&#xff0c;如何保證高效且不出錯 &#xff1f; 大數…

使用cursor進行原型圖設計

1.下載cursor 2.模式設置&#xff1a; 模型使用claude-3.7-sonnet的think模式 3.引導詞模板&#xff1a; 我想要開發一個中高考英語口語考試的模擬考試系統&#xff0c;我需要將上面的這個應用輸出成高保真的原型圖設計。請考慮以下的規范&#xff1a; 用戶體驗&#xff1…

極狐GitLab 功能標志詳解

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 功能標志 (BASIC ALL) 使用功能標志&#xff0c;您可以將應用程序的新功能小批量部署到生產環境中。您可以為部分用戶打開和…

AI與無人駕駛汽車:如何通過機器學習提升自動駕駛系統的安全性?

引言 想象一下&#xff0c;在高速公路上&#xff0c;一輛無人駕駛汽車正平穩行駛。突然&#xff0c;前方的車輛緊急剎車&#xff0c;而旁邊車道有一輛摩托車正快速接近。在這千鈞一發的瞬間&#xff0c;自動駕駛系統迅速分析路況&#xff0c;判斷最安全的避險方案&#xff0c;精…

【NLP 63、大模型應用 —— Agent】

人與人最大的差距就是勇氣和執行力&#xff0c;也是唯一的差距 —— 25.4.16 一、Agent 相關工作 二、Agent 特點 核心特征&#xff1a; 1.專有場景&#xff08;針對某個垂直領域&#xff09; 2.保留記憶&#xff08;以一個特定順序做一些特定任務&#xff0c;記憶當前任務的前…

RAGFlow本地部署教程 :多模態檢索+動態生成,用AI重構企業知識生產力

RAGFlow是一款基于檢索增強生成&#xff08;RAG&#xff09;技術的智能工作流平臺&#xff0c;通過整合多源數據檢索與生成式AI模型&#xff0c;優化企業知識管理、智能問答及自動化報告生成&#xff0c;核心功能包括&#xff1a; 多源數據融合&#xff1a;支持數據庫、文檔庫、…

【C/C++】深入理解指針(二)

文章目錄 深入理解指針(二)1.const修飾指針1.1 const修飾變量1.2 const修飾指針變量 2.野指針2.1 野指針成因1.指針未初始化2. 指針越界訪問3.指針指向的空間釋放 2.2 如何規避野指針2.2.1 指針初始化2.2.2 小心指針越界2.2.3 指針變量不再使?時&#xff0c;及時置NULL&#x…

【verilog】在同一個 always 塊中寫了多個“看起來獨立”的 if / if-else,到底誰先誰后,怎么執行?會不會沖突?

&#x1f50d; 問題本質 在一個 always (posedge clk) 塊中&#xff0c;所有的代碼都是順序執行的。但這不意味著它就像軟件一樣“一條一條執行”&#xff0c;因為最終是電路&#xff01;電路是并行存在的&#xff01; Verilog 是硬件描述語言&#xff08;HDL&#xff09;&am…

【React】什么是 Hook

useStateuseEffectuseRef 什么是hook&#xff1f;16.8版本出現的新特性。可以在不編寫class組件的情況下使用state以及其它的React特性 為什么有hook&#xff1f;class組件很難提取公共的重用的代碼&#xff0c;然后反復使用&#xff1b;不編寫類組件也可以使用類組件的狀態st…

如何查看自己抖音的IP屬地?詳細教程及如何修改

在當今互聯網時代&#xff0c;IP屬地信息已成為各大社交平臺&#xff08;如抖音、微博、快手等&#xff09;展示用戶真實網絡位置的重要功能。以下是關于如何查看抖音IP屬地的詳細教程及常見問題解答&#xff0c;幫助您快速了解相關信息&#xff1a; 一、如何查看抖音賬號的IP屬…

深度學習算力革新:AI服務器在運維工作中的智能化實踐

【導語】作為IT基礎設施服務領域的從業者&#xff0c;我們在日常工作中發現&#xff0c;AI服務器的智能化運維能力正在重塑傳統IDC的管理模式。本文將以DeepSeek系列服務器為例&#xff0c;分享智能算力設備在真實運維場景中的創新應用。 一、傳統服務器集群的運維痛點 在數據…

安裝部署RabbitMQ

一、RabbitMQ安裝部署 1、下載epel源 2、安裝RabbitMQ 3、啟動RabbitMQ web管理界面 啟用插件 rabbitmq數據目錄 創建rabbitmq用戶 設置為管理員角色 給用戶賦予權限 4、訪問rabbitmq

中間件--ClickHouse-4--向量化執行(什么是向量?為什么向量化執行的更快?)

1、向量&#xff08;Vector&#xff09;的概念 &#xff08;1&#xff09;、向量的定義 向量&#xff1a;在計算機科學中&#xff0c;向量是一組同類型數據的有序集合&#xff0c;例如一個包含多個數值的數組。在數據庫中&#xff0c;向量通常指批量數據&#xff08;如一列數…

Python PDF 轉 Markdown 工具庫對比與推薦

根據最新評測及開源社區實踐&#xff0c;以下為綜合性能與適用場景的推薦方案&#xff1a; 1. ?Marker? ?特點?&#xff1a; 轉換速度快&#xff0c;支持表格、公式&#xff08;轉為 LaTeX&#xff09;、圖片提取&#xff0c;適配復雜排版文檔?。依賴 PyTorch&#xff0c…

Vue 和 Spring boot 和 Bean 不同生命周期

一、Vue 組件生命周期 父子組件生命周期順序&#xff1a; 創建時&#xff1a; 父 beforeCreate → 父 created → 父 beforeMount → 子組件生命周期 → 父 mounted 更新時&#xff1a; 父 beforeUpdate → 子組件更新 → 父 updated。 銷毀時&#xff1a; 父 beforeDestroy…

Microsoft Azure 基礎知識簡介

Microsoft Azure 基礎知識簡介 已完成100 XP 2 分鐘 Microsoft Azure 是一個云計算平臺&#xff0c;提供一系列不斷擴展的服務&#xff0c;可幫助你構建解決方案來滿足業務目標。 Azure 服務支持從簡單到復雜的一切內容。 Azure 具有簡單的 Web 服務&#xff0c;用于在云中托…

C語言鏈接數據庫

目錄 使用 yum 配置 mysqld 環境 查看 mysqld 服務的版本 創建 mysql 句柄 鏈接數據庫 使用數據庫 增加數據 修改數據 查詢數據 獲取查詢結果的行數 獲取查詢結果的列數 獲取查詢結果的列名 獲取查詢結果所有數據 斷開鏈接 C語言訪問mysql數據庫整體源碼 通過…