RESTful API 使用 JSON Web Token 实现安全认证与授权

什么是 RESTful API

RESTful API 是一种基于 HTTP 协议的 API 设计风格,它将资源的状态和操作以 URL 和 HTTP 方法的形式暴露给客户端,使得客户端可以通过 HTTP 请求来操作这些资源。RESTful API 的设计风格简单、灵活、可扩展,因此被广泛应用于 Web 应用程序、移动应用程序等领域。

什么是 JSON Web Token

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑、自包含的方式,用于在各个系统之间安全地传输信息。JWT 由三部分组成:头部、载荷和签名。头部包含了 JWT 的类型和使用的加密算法,载荷包含了 JWT 的信息,签名用于验证 JWT 的合法性。

为什么要使用 JWT 实现安全认证与授权

在使用 RESTful API 进行客户端和服务器之间的通信时,需要进行安全认证和授权。传统的安全认证方式包括基于会话的认证和基于令牌的认证。基于会话的认证需要在服务器端保存会话状态,而基于令牌的认证则可以避免服务器端保存会话状态,提高了系统的可扩展性和灵活性。JWT 是一种基于令牌的认证方式,使用 JWT 可以实现无状态的认证和授权,同时也可以避免 CSRF 攻击和 XSS 攻击等安全问题。

如何使用 JWT 实现安全认证与授权

1. 生成 JWT

在服务器端生成 JWT 的过程如下:

const jwt = require('jsonwebtoken');
const secretKey = 'secret'; // 密钥

const payload = {
  userId: '123456',
  username: 'john'
}; // 载荷

const options = {
  expiresIn: '1h' // 过期时间
}; // 选项

const token = jwt.sign(payload, secretKey, options); // 生成 JWT

2. 验证 JWT

在客户端验证 JWT 的过程如下:

const jwt = require('jsonwebtoken');
const secretKey = 'secret'; // 密钥

const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0NTYiLCJ1c2VybmFtZSI6ImpvaG4iLCJleHAiOjE2MjIwMzYwNjAsImlhdCI6MTYyMjAzMzQ2MH0.l0JY1jK8z2ZaQlZ0RvK0L7hKj3yLq0X9zRnZjQ2ZbFk'; // JWT

jwt.verify(token, secretKey, (err, decoded) => { // 验证 JWT
  if (err) {
    console.error(err);
  } else {
    console.log(decoded);
  }
});

3. 在 RESTful API 中使用 JWT

在 RESTful API 中使用 JWT 的过程如下:

const express = require('express');
const jwt = require('jsonwebtoken');
const secretKey = 'secret'; // 密钥

const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

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

  // 验证用户名和密码
  if (username === 'john' && password === '123456') {
    const payload = {
      userId: '123456',
      username: 'john'
    }; // 载荷

    const options = {
      expiresIn: '1h' // 过期时间
    }; // 选项

    const token = jwt.sign(payload, secretKey, options); // 生成 JWT

    res.json({
      success: true,
      token
    });
  } else {
    res.json({
      success: false,
      message: 'Invalid username or password'
    });
  }
});

app.get('/profile', (req, res) => {
  const token = req.headers.authorization.split(' ')[1]; // 获取 JWT

  jwt.verify(token, secretKey, (err, decoded) => { // 验证 JWT
    if (err) {
      res.json({
        success: false,
        message: 'Invalid token'
      });
    } else {
      res.json({
        success: true,
        userId: decoded.userId,
        username: decoded.username
      });
    }
  });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

在上述示例代码中,/login 路由用于验证用户名和密码,并生成 JWT;/profile 路由用于验证 JWT,并返回用户信息。客户端在访问 /profile 路由时,需要在请求头中添加 Authorization 字段,其值为 Bearer <JWT>,其中 <JWT> 是由服务器端生成的 JWT。

总结

使用 JWT 实现安全认证与授权具有无状态、可扩展、灵活等优点,能够提高系统的可维护性和安全性。在实际开发中,需要注意密钥的安全性、过期时间的设置、JWT 的传输方式等问题。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65c49f6eadd4f0e0fff2d351