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.mzph.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数据库整体源码 通过…