首页 前端知识 node.js如何使用JWT(JSON Web Token)进行认证?

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

2024-09-04 23:09:21 前端知识 前端哥 683 59 我要收藏

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

什么是JWT?

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

  1. 头部(Header)
  2. 载荷(Payload)
  3. 签名(Signature)

. 头部(Header)

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

{
  "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应用中,实现安全和高效的用户认证。


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

在这里插入图片描述

转载请注明出处或者链接地址:https://www.qianduange.cn//article/17697.html
标签
评论
发布的文章

javascript jQuery

2024-09-21 22:09:33

【若依】表格固定列宽

2024-09-21 22:09:30

Knockout-jQueryUI 使用指南

2024-09-21 22:09:29

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!