网易首页 > 网易号 > 正文 申请入驻

Express用户被JWT绕晕3年,这教程把认证流程拆成了7步

0
分享至


你写的Express接口,现在任何人都能直接调用。这不是漏洞,是根本没装锁。

真实世界的API需要登录、拿密钥、再带着密钥请求数据。这套流程用JSON Web Token(JWT)实现,但官方文档像说明书,看完还是不会装。本文把Express+JWT认证拆成7个可执行的步骤,从空文件夹到能用的登录系统。

第1步:把依赖装对,省掉后面80%的报错

新建文件夹,初始化项目。npm init -y生成package.json后,装这四个包:express(框架)、mongoose(连MongoDB)、dotenv(读环境变量)、nodemon(热重启)。

改package.json的"type"为"module"才能用ESM语法。然后建index.js,写最简Express启动代码:

import express from 'express' const app = express(); const Port = process.env.PORT || 5000 const start = ()=>{ app.listen(Port, ()=>{ console.log('The server is running ....'); }) } start();

npm start看到"The server is running…"就算过。这步错了,后面全错。

第2步:MongoDB连接字符串别硬编码

建.env文件,把Atlas集群的连接字符串贴进去。格式长这样:MONGO_URI = mongodb+srv://name:password@clustername.xxx.mongodb.net/LoginApp?appName=NodeExpressTutorial。

单独建Database/connectdb.js处理连接逻辑,用mongoose.connect(url)方法。index.js里引入这个模块,用async/await包裹启动逻辑,连不上数据库时catch块能打印错误。

关键细节:process.env.MONGO_URI要在dotenv/config加载后才能读到,顺序错了会报undefined。


第3步:用户模型要存密码的"指纹"而非密码本身

建Models/User.js,定义schema:用户名、邮箱、密码。但密码字段不能直接存明文,要用bcrypt加盐哈希。

盐(salt)是随机字符串,和密码拼接后再哈希。同样密码,不同盐值,哈希结果完全不同。即使数据库泄露,攻击者也无法反推原始密码。

在schema的pre('save')钩子中自动处理哈希。用户注册时传入明文密码,入库前自动变成60字符的哈希串。登录时再拿用户输入的密码,用bcrypt.compare()和库存哈希比对。

第4步:JWT的签发和验证拆成两个中间件

用户登录成功后,服务端要发"门票"——JWT。这个token包含用户ID和过期时间,用服务器密钥签名。客户端之后每次请求都带着token,服务端验证签名有效就放行。

建两个工具函数:createJWT用jsonwebtoken库的sign方法签发,verifyJWT用verify方法验证。密钥存环境变量JWT_SECRET,别写死在代码里。

token的有效期设多长?教程示例用30天,生产环境建议2小时+刷新机制。但本文是入门教程,先跑通再优化。

第5步:注册和登录路由要分开测

建Routes/auth.js,写两个POST端点。/register接收用户名、邮箱、密码,查重后创建用户,返回201。/login查邮箱是否存在,bcrypt比对密码,通过就签发JWT返回给客户端。

测试时用Postman或curl,先看注册能否入库,再看登录能否拿到token。两步都通,再往下做。


常见卡壳点:密码比对失败——检查bcrypt.compare的参数顺序,明文在前,哈希在后。token没返回——检查JWT_SECRET是否加载成功。

第6步:保护路由的 middleware 是最后一道门

建middleware/auth.js,导出一个验证函数。从请求头取Authorization字段,格式应该是Bearer 。提取token部分,用verifyJWT解码,拿到用户ID后查库确认存在,最后把用户信息挂到req.user上供后续使用。

哪个路由需要保护,就在前面加这个中间件。比如app.get('/dashboard', authenticateUser, dashboardController),没token或token无效的直接返回401。

注意:JWT验证通过只说明token没被篡改,不说明用户还存在。中间件里加一步数据库查询,防止用户已注销但token未过期的情况。

第7步:错误处理要覆盖三种失败场景

认证系统有三类错误:数据库连接失败(500)、凭证错误(401)、权限不足(403)。现在分别处理。

mongoose连接失败时,index.js的catch块打印error.message。登录时邮箱不存在或密码错误,统一返回"Invalid credentials",别告诉攻击者到底是哪个错了。token过期或无效,返回401并提示重新登录。

用express-async-errors包或自己写wrapper,避免每个async路由都写try-catch。错误中间件放在所有路由最后,接收(err, req, res, next)四个参数。

完整的认证系统现在能跑通:注册→登录→拿token→访问受保护路由→token过期重新登录。代码量不到200行,但每个环节都有坑。

你现在的token有效期设了多久?如果超过24小时,建议看看OWASP的会话管理建议。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
打到了绝世好车!

打到了绝世好车!

新住家居
2026-04-06 06:05:50
中美俄意见达成一致:宁愿日本消失,也绝不能让他们拥有核武器

中美俄意见达成一致:宁愿日本消失,也绝不能让他们拥有核武器

嫹笔牂牂
2026-04-06 14:42:58
世锦赛下午六点开锣!赵心童是1号种子,和丁俊晖、肖国栋同区!

世锦赛下午六点开锣!赵心童是1号种子,和丁俊晖、肖国栋同区!

格斗社
2026-04-06 10:17:50
战争有多烧钱,网友说我讲一下我家里的局部战争你就明白

战争有多烧钱,网友说我讲一下我家里的局部战争你就明白

侃神评故事
2026-04-06 11:45:08
友商评张雪:他不成功天理难容,这个男人真的可以带我们称霸世界

友商评张雪:他不成功天理难容,这个男人真的可以带我们称霸世界

干史人
2026-04-05 22:30:03
普通家庭给孩子最好的托举是什么?张雪峰:做到这7点少走十年弯路

普通家庭给孩子最好的托举是什么?张雪峰:做到这7点少走十年弯路

户外阿毽
2026-04-06 06:09:27
院士罕见发话:别再叫北斗“中国版GPS”了!差距大到离谱!

院士罕见发话:别再叫北斗“中国版GPS”了!差距大到离谱!

小兰聊历史
2026-04-05 05:34:48
人类重返月球!NASA阿耳忒弥斯2号宇航员抵达月球空间

人类重返月球!NASA阿耳忒弥斯2号宇航员抵达月球空间

IT之家
2026-04-06 13:17:17
民进党,极有可能在下一届台湾地区选举后,成为长期一家独大政党

民进党,极有可能在下一届台湾地区选举后,成为长期一家独大政党

李橑在北漂
2026-04-02 10:22:26
抓李镇全头发被罚下,米特里策社媒致歉:我失去了冷静没控制好自己

抓李镇全头发被罚下,米特里策社媒致歉:我失去了冷静没控制好自己

懂球帝
2026-04-06 15:04:10
盲目的大学扩招,正在反噬整个社会

盲目的大学扩招,正在反噬整个社会

凡人志
2026-03-25 01:34:53
很多人,都低估了30年房贷的杀伤力

很多人,都低估了30年房贷的杀伤力

一条要飞跃的咸鱼
2026-04-06 11:08:43
油价大涨超1.8元/升创新高,清明节假期后(4月7日)汽柴油或再大涨

油价大涨超1.8元/升创新高,清明节假期后(4月7日)汽柴油或再大涨

油价早知道
2026-04-05 01:45:53
留给美国时间不多了,伊朗战争打完后,世界就只剩一个超级大国了

留给美国时间不多了,伊朗战争打完后,世界就只剩一个超级大国了

触摸史迹
2026-04-02 14:39:03
特朗普暗示“最后期限”推迟1天,伊朗提出开放霍尔木兹海峡条件

特朗普暗示“最后期限”推迟1天,伊朗提出开放霍尔木兹海峡条件

大风新闻
2026-04-06 08:27:21
松岛辉空:谈不上完全满意,但战胜了以往赢不了的对手

松岛辉空:谈不上完全满意,但战胜了以往赢不了的对手

懂球帝
2026-04-06 11:01:22
深圳房价真要跌到5万?2026年回暖信号已现,真相是…

深圳房价真要跌到5万?2026年回暖信号已现,真相是…

房探科技
2026-04-06 14:24:13
天津一地烧纸引发火情,过火面积达600余㎡!

天津一地烧纸引发火情,过火面积达600余㎡!

天津族
2026-04-06 07:32:47
0-4惨败,中国女足获得蒙太古杯亚军,连续2届决赛输给日本

0-4惨败,中国女足获得蒙太古杯亚军,连续2届决赛输给日本

侧身凌空斩
2026-04-06 04:59:02
突然拉升!美联储、鲍威尔,突发!降息,大消息!

突然拉升!美联储、鲍威尔,突发!降息,大消息!

证券时报e公司
2026-04-04 22:12:45
2026-04-06 16:43:00
薛定谔的BUG
薛定谔的BUG
有态度网友ytd
856文章数 29关注度
往期回顾 全部

科技要闻

前同事被蒸馏成Token,AI能否偷走职场经验

头条要闻

外媒:美国副总统万斯和伊朗外长等人彻夜交流

头条要闻

外媒:美国副总统万斯和伊朗外长等人彻夜交流

体育要闻

球员系列赛大满贯!赵心童10-3世界第一 加冕赛季第4冠

娱乐要闻

乔任梁离世10年 父母曝舞台光鲜的背后

财经要闻

史诗级暴跌"一周年" A股接下来如何走?

汽车要闻

阿维塔06T快上市了 旅行车还能这么玩?

态度原创

艺术
时尚
健康
数码
公开课

艺术要闻

草书入门的“最强宝典”!因内容太妙,作者不敢留名,比学王羲之都靠谱

AI时代,辨别真相的成本变高了

干细胞抗衰4大误区,90%的人都中招

数码要闻

“核战”升级!Intel下代CPU 42核心变44核心 这还没完

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版