node.js如何使用JWT(JSON Web Token)进行认证?

JJCTO袁龙 2024-08-01 15:03:03 阅读 86

在现代Web开发中,认证是一个非常重要的环节。为了管理控制用户的访问权限,使用JWT(JSON Web Token)进行认证是一个非常流行和安全的方法。JWT是一种令牌在客户端和服务器之间安全地传信息。在这篇博客中,我将详细介绍如何在Node.js中使用JWT进行认证,包含示例代码,帮助您理解其概念和使用方法。

什么是JWT?

JSON Web Token(JWT)是一种用于声明某些权利的JSON对象。它通常是一个长字符串,由三个部分组成,分别用点(.)分:

头部(Header)载荷(Payload)签名(Signature

. 头部(Header)

头部通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法(例如 HMAC SHA256 或 RSA)。

<code>{

"alg": "HS256",

"typ": "JWT"

}

2. 载荷(Payload)

载荷部分包含声明(Claims),声明是关于实体(通常是用户)和附加数据的信息。声明有三类型:registered, public, 和 private。存储在此部分中的信息是明文的,不加密存储,因此不应包含敏感数据。

一个简单的载荷可能包含这样的信息:

{

"sub": "1234567890",

"name": "John Doe",

"admin": true

}

3 签名(Signature)

要创建签名部分,可以将编码后的头部、编码后的载荷和一个密结合在一起,并使用指定的签名算法对其进行签名。例如,如果使用 HMAC SHA256 算法,签名将是这样计算的:

HMACSHA256(

base64UrlEncode(header) + "." +

base64UrlEncode(payload),

your-256-bit-secret

)

签名用于验证消息在传输过程中是否未被篡改。

在Node.js中使用JWT

下面是一个完整的示例,展示了如何在Node.js中使用JWT进行用户认证。

1.装必要包

首先,我们需要安装一些包,包括 jsonwebtokenexpress

npm install express jsonwebtoken body-parser

2. 创建Express服务器

接下来,我们将创建一个简单的Express服务器,并使用JWT进行用户认证。

const express = require('express');

const bodyParser = require('body-parserconst jwt = require('jsonwebtoken');

const app = express();

const PORT = process.env.PORT || 3000;

const SECRET_KEY = 'your-256-bit-secret';

app.useParser.json());

// 模拟一个用户数据库

const users = [

{

id: 1,

username: 'john',

password: 'password123'

}

];

// 登录接口

app.post('/login', (req, res) => {

const { username, password } = req.body;

// 验证用户名和密码

const user = users.find(u => u.username === username && u.password === password);

if (user) {

const token = jwt.sign({ id: user.id, username: user.username }, SECRET_KEY, { expiresIn: '1h' });

res.json({ token });

} else {

res.status(401).json({ message: '用户名或密码错误!' });

}

});

// 认证中间件

const authenticateJWT = (req, res, next) => {

const token = req.header('Authorization');

if (token) {

jwt.verify(token, SECRET_KEY, (err, user) => {

if (err) {

return res.sendStatus(403);

}

req.user = user;

next();

});

} else {

res.sendStatus(401);

}

};

// 受保护的接口

app.get('/protected', authenticateJWT, (req, res) => {

res.json({ message: '您已经成功访问了受保护的路由!' });

});

app.listen(PORT, () => {

console.log(`服务器运行在 http://localhost:${ PORT}`);

});

在上面的示例中,我们创建了一个简单的Express应用程序,并包含了以下关键部分:

2.1 登录接口

登录接口(/login)用于验证用户的用户名和密码。如果验证成功,会生成一个JWT,并将其返回给客户端。

2.2 认证中间件

authenticateJWT 中间件用于验证请求是否携带有效的JWT。如果携带了有效的JWT,则该请求被允许继续,否则响应状态将为401 (Unauthorized) 或403 (Forbidden)。

2.3 受保护的接口

受保护的接口(/protected)使用 authenticateJWT 中间件进行保护,只有携带有效的请求才能访问。

如何测试你可以使用 curl 或任何HTTP客户端(如Postman)来测试以上示例应用。

1. 登录

首先,通过 /login 接口获取JWT:

curl -H "Content-Type: application/json" -X POST -d '{"username":"john", "password":"password123"}' http://localhost:3000/login

你会得到类似如下的响应,其中包含生成的JWT:

{

"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6Ikp...rest_of_token"

}

2. 访问受保护的接口

接下来,使用获取的JWT访问受保护的接口:

curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6Ikp...rest_of_token" http://localhost:3000/protected

如果JWT有效,你将得到以下响应:

{

"message": "您已经成功访问了受保护的路由!"

}

如果JWT无效,服务器将返回403或401状态。

总结

在这篇博客中,我们详细介绍了如何在Node.js中使用JWT进行用户认证。我们讨论了JWT的基本构成及其组成部分,并提供了完整的Node.js示例代码来说明如何实现JWT认证。通过这个示例,你可以将JWT轻松集成到你的Web应用中,实现安全和高效的用户认证。


最后问候亲爱的朋友们,并邀请你们阅读我的全新著作

在这里插入图片描述



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。