JWT概念(案例代码)

JWT(JSON Web Token)是一种在网络应用间传递信息的标准方法,它使用JSON对象作为发出方和接收方之间的交换格式,用于验证和授权。JWT由三部分组成:Header、Payload和Signature。

Header:包含了JWT的类型、加密算法等信息。

Payload:包含了存放在JWT中传输的信息,也叫做声明(claim)。声明分为三种类型:注册声明(registered claims)、公共声明(public claims)和私人声明(private claims)。

Signature:用于验证消息的完整性并防止篡改。Signature由Header中指定的加密算法和密钥生成。

JWT的工作流程大致如下:

1.用户通过用户名和密码进行身份验证

2.服务器验证用户身份成功后,生成一个JWT并将其发送给用户

3.用户之后的每个请求都将在JWT中携带身份信息

4.服务器检查JWT的签名并验证用户是否有权访问请求的资源

JWT的优点:

1、JWT 是基于标准的JSON格式,易于生成和解析。

2、JWT 包括了签名信息,可以验证消息的完整性并防止篡改。

3、JWT 可以轻松传输在多种环境,例如移动设备、浏览器和服务器,因为它们只需要通过HTTP传输。

4、 JWT是无状态的,即保存在客户端,适合分布式项目开发。

5、JWT可以有效防止CSRF攻击。因为JWT需要服务器签名,黑客无法伪造,JWT中包含终端用户的信息,所以对数据的访问可以追踪。

以下是一个简单的使用 JWT 实现身份验证的示例代码:

  1. 安装相关依赖
npm install express jsonwebtoken body-parser

  1. 创建一个 Express 应用
const express = require('express');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');

const app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// 设置密钥
const SECRET_KEY = 'my_secret_key';

// 登录路由
app.post('/login', (req, res) => {
  const { username, password } = req.body;

  // 模拟用户验证
  if (username === 'admin' && password === 'admin') {
    // 生成 JWT
    const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
    res.json({ success: true, token });
  } else {
    res.json({ success: false, message: 'Invalid username or password' });
  }
});

// 需要身份验证的路由
app.get('/protected', (req, res) => {
  const token = req.headers.authorization;

  if (!token) {
    // 返回未授权错误
    return res.status(401).json({ success: false, message: 'Unauthorized' });
  }

  // 验证 JWT
  jwt.verify(token, SECRET_KEY, (err, decoded) => {
    if (err) {
      return res.status(401).json({ success: false, message: 'Invalid token' });
    }

    // 在这里进行身份验证后,可以放行请求
    res.json({ success: true, message: 'Welcome, ' + decoded.username });
  });
});

// 启动应用
app.listen(3000, () => console.log('App listening on port 3000'));

在上面的代码中,我们首先创建了一个 Express 应用,并使用 bodyParser 中间件解析请求体。

然后,我们定义了一个 POST /login 路由,在这个路由中,我们模拟了用户验证过程,并使用 jsonwebtoken 库生成了一个 JWT,并返回到客户端。

最后,我们定义了一个 GET /protected 路由,该路由需要进行身份验证。在这个路由中,我们首先获取请求头中的 Authorization 字段,然后使用 jsonwebtoken 库验证 JWT。如果 JWT 验证通过,则进行身份认证,并返回请求成功的响应;否则返回未授权的响应。

在实际应用中,我们可以将上述代码根据具体需求进行调整和拓展,以实现更灵活的身份验证机制。

你可能感兴趣的:(JWT)