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
- 创建一个Java项目,并添加所需的依赖。我们可以使用Maven来管理依赖项。在
pom.xml
文件中,添加以下依赖项:
<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
</dependencies>
- 创建一个
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();
}
}
- 在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;
}
}
- 运行Java应用程序,并尝试使用
/login
路由进行用户登录,该路由将返回一个有效的JWT token。
构建前端:Node.js
- 在Node.js项目中安装Express.js框架和jsonwebtoken库。运行以下命令:
npm install express jsonwebtoken
- 在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;
}
- 启动Node.js应用程序,并使用
/login
路由进行用户登录,该路由将返回一个有效的JWT token。
总结
通过本博客,我们从零开始构建了一个简单的JWT认证系统,使用Java和Node.js等技术。JWT是一种非常强大和灵活的认证机制,可以在多种编程语言和平台上使用。希望这个示例对你有所帮助,并且能够帮助你理解和应用JWT认证。如有任何疑问或建议,请随时提出。
本文来自极简博客,作者:文旅笔记家,转载请注明原文链接:从零开始构建一个简单的JWT认证系统:使用Java、Node.js等技术的示例