从零开始构建一个简单的JWT认证系统:使用Java、Node.js等技术的示例

文旅笔记家 2019-03-25 ⋅ 17 阅读

JWT(JSON Web Token)是一种用于身份认证和授权的开放标准。在本博客中,我们将从零开始构建一个简单的JWT认证系统,使用Java和Node.js等技术以示例说明。

JWT简介

JSON Web Token(JWT)是一种基于JSON的开放标准(RFC 7519),用于在各方之间安全地传输声明。JWT通常用于身份验证和授权。它由三部分组成:头部、载荷和签名。

  • 头部包含有关token的元数据,例如签名算法和token的类型。
  • 载荷包含要传输的声明,例如用户ID和角色。
  • 签名是对头部和载荷进行加密的签名,以确保token的完整性和可信性。

准备工作

在开始构建JWT认证系统之前,我们需要准备以下工具和技术:

  • Java开发环境(JDK)
  • Node.js环境
  • Maven(用于Java项目的依赖管理)
  • Express.js框架(用于Node.js的Web应用程序框架)
  • JWT库(用于Java和Node.js的JWT生成和验证)

构建后端:Java

  1. 创建一个Java项目,并添加所需的依赖。我们可以使用Maven来管理依赖项。在pom.xml文件中,添加以下依赖项:
<dependencies>
  <dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
  </dependency>
</dependencies>
  1. 创建一个JwtUtil类来处理JWT的生成和验证。以下是一个示例实现:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JwtUtil {

    private static final String SECRET_KEY = "your-secret-key";
    private static final long EXPIRATION_TIME = 3600000; // 1 hour

    public static String generateToken(String subject) {
        Date now = new Date();
        Date expiration = new Date(now.getTime() + EXPIRATION_TIME);

        return Jwts.builder()
                .setSubject(subject)
                .setIssuedAt(now)
                .setExpiration(expiration)
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public static boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public static String extractSubject(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }
}
  1. 在Java项目中创建一个UserController类,并添加以下代码来处理用户验证逻辑。以下示例使用Spring Boot和Spring Web:
import org.springframework.web.bind.annotation.*;

@RestController
public class UserController {

    @PostMapping("/login")
    public String login(@RequestBody User user) {
        // 在这里实现用户验证逻辑
        // 如果用户名和密码有效,则生成并返回JWT token
        if (isValidUser(user)) {
            String token = JwtUtil.generateToken(user.getUsername());
            return token;
        } else {
            return "Invalid username or password.";
        }
    }

    @GetMapping("/user")
    public String user(@RequestHeader("Authorization") String authorization) {
        // 验证Authorization header中的JWT token
        String token = authorization.replace("Bearer ", "");
        if (JwtUtil.validateToken(token)) {
            String username = JwtUtil.extractSubject(token);
            return "Hello, " + username + "!";
        } else {
            return "Invalid token.";
        }
    }

    private boolean isValidUser(User user) {
        // 在这里实现用户验证逻辑
        // 检查用户名和密码是否正确
        // 省略实现细节
        return true;
    }
}
  1. 运行Java应用程序,并尝试使用/login路由进行用户登录,该路由将返回一个有效的JWT token。

构建前端:Node.js

  1. 在Node.js项目中安装Express.js框架和jsonwebtoken库。运行以下命令:
npm install express jsonwebtoken
  1. 在Node.js项目中创建一个app.js文件,并添加以下代码来设置Express应用程序和路由:
const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();
const secretKey = 'your-secret-key';

app.use(express.json());

app.post('/login', (req, res) => {
  // 在这里实现用户验证逻辑
  // 如果用户名和密码有效,则生成并返回JWT token
  const { username, password } = req.body;
  if (isValidUser(username, password)) {
    const token = jwt.sign({ username }, secretKey, { expiresIn: '1h' });
    res.send(token);
  } else {
    res.status(401).send('Invalid username or password.');
  }
});

app.get('/user', (req, res) => {
  // 验证Authorization header中的JWT token
  const token = req.headers.authorization.replace('Bearer ', '');
  try {
    const decoded = jwt.verify(token, secretKey);
    const username = decoded.username;
    res.send(`Hello, ${username}!`);
  } catch (error) {
    res.status(401).send('Invalid token.');
  }
});

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

function isValidUser(username, password) {
  // 在这里实现用户验证逻辑
  // 检查用户名和密码是否正确
  // 省略实现细节
  return true;
}
  1. 启动Node.js应用程序,并使用/login路由进行用户登录,该路由将返回一个有效的JWT token。

总结

通过本博客,我们从零开始构建了一个简单的JWT认证系统,使用Java和Node.js等技术。JWT是一种非常强大和灵活的认证机制,可以在多种编程语言和平台上使用。希望这个示例对你有所帮助,并且能够帮助你理解和应用JWT认证。如有任何疑问或建议,请随时提出。


全部评论: 0

    我有话说: