首页 > web前端 > js教程 > 正文

在 Web 应用程序中创建和保护 JWT 身份验证

Susan Sarandon
发布: 2024-11-11 11:09:03
原创
574 人浏览过

Creating and Securing JWT Authentication in a Web App

介绍

JSON Web 令牌 (JWT) 是一种紧凑且独立的方式,可将信息作为 JSON 对象在各方之间安全传输。 JWT 广泛用于对 Web 应用程序中的用户进行身份验证。在本教程中,我们将使用 JWT 身份验证构建 Node.js 和 Express 后端。

什么是智威汤逊?

JWT(JSON Web Token)是一种开放标准,用于以 JSON 对象的形式在各​​方之间安全地传输信息。每个令牌由三部分组成:

  1. 标头:包含有关令牌类型和哈希算法的信息。
  2. 有效负载:包含用户信息和声明。
  3. 签名:验证令牌的完整性。

示例 JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0IiwidXNlcm5hbWUiOiJqb2huZG9lIn0.H6BBiB1y5eXKXvW9bbjT2Rg8Jp4oE4Y5Kxf_sDF7Kzg
登录后复制
登录后复制

设置项目

  1. 创建一个新的项目目录:

    mkdir jwt-auth-app
    cd jwt-auth-app
    
    登录后复制
  2. 初始化一个新的 Node.js 项目:

    npm init -y
    
    登录后复制

安装依赖项

安装必要的依赖项:

npm install express jsonwebtoken bcryptjs dotenv express-validator
登录后复制
  • express:Node.js 的 Web 框架。
  • jsonwebtoken:用于生成和验证 JWT 的库。
  • bcryptjs:用于哈希密码的库。
  • dotenv:用于环境变量。
  • express-validator:用于验证输入数据。

配置服务器

在 server.js 中创建基本服务器设置:

// server.js
require('dotenv').config();
const express = require('express');
const app = express();
app.use(express.json());

// Import Routes
const authRoutes = require('./routes/auth');
app.use('/api/auth', authRoutes);

const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
登录后复制

创建.env文件用于存储环境变量:

PORT=5000
JWT_SECRET=your_jwt_secret_key
登录后复制

创建用户认证路由

  1. 为身份验证路由创建routes/auth.js文件:
// routes/auth.js
const express = require('express');
const { body, validationResult } = require('express-validator');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const router = express.Router();

const users = []; // In-memory user storage

// Signup Route
router.post(
  '/signup',
  [
    body('username').isLength({ min: 3 }),
    body('password').isLength({ min: 5 })
  ],
  async (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) return res.status(400).json({ errors: errors.array() });

    const { username, password } = req.body;
    const hashedPassword = await bcrypt.hash(password, 10);

    users.push({ username, password: hashedPassword });
    res.status(201).json({ message: 'User registered successfully' });
  }
);

// Login Route
router.post(
  '/login',
  [
    body('username').notEmpty(),
    body('password').notEmpty()
  ],
  async (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) return res.status(400).json({ errors: errors.array() });

    const { username, password } = req.body;
    const user = users.find(u => u.username === username);

    if (!user) return res.status(400).json({ message: 'Invalid credentials' });

    const isMatch = await bcrypt.compare(password, user.password);
    if (!isMatch) return res.status(400).json({ message: 'Invalid credentials' });

    const token = jwt.sign({ username }, process.env.JWT_SECRET, { expiresIn: '1h' });
    res.json({ token });
  }
);

module.exports = router;
登录后复制
  1. 路线说明
  • 注册路线:在存储用户之前验证并散列密码。
  • 登录路由:验证凭据、检查密码并颁发 JWT 令牌。

生成 JWT 令牌

  • jwt.sign 方法生成一个包含用户信息的令牌。
  • JWT_SECRET 用于签署令牌,应保持安全和私密。
const token = jwt.sign({ username }, process.env.JWT_SECRET, { expiresIn: '1h' });
登录后复制

使用 JWT 保护路由

为了保护路由,请创建一个中间件来验证令牌。

  1. 创建中间件/auth.js:
// middleware/auth.js
const jwt = require('jsonwebtoken');

module.exports = function (req, res, next) {
  const token = req.header('Authorization')?.split(' ')[1];
  if (!token) return res.status(401).json({ message: 'Access denied' });

  try {
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    req.user = decoded;
    next();
  } catch (ex) {
    res.status(400).json({ message: 'Invalid token' });
  }
};
登录后复制
  1. 保护 server.js 中的路由:

创建需要有效令牌的受保护路由:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0IiwidXNlcm5hbWUiOiJqb2huZG9lIn0.H6BBiB1y5eXKXvW9bbjT2Rg8Jp4oE4Y5Kxf_sDF7Kzg
登录后复制
登录后复制

中间件说明

  • 中间件检查授权标头中是否存在令牌。
  • 如果令牌有效,则用户的信息将添加到 req 对象中,从而允许访问受保护的路由。

结论

在本教程中,我们介绍了在 Node.js 和 Express 后端设置 JWT 身份验证的基础知识。本指南演示了:

  1. 设置注册和登录的身份验证路由。
  2. 创建和验证 JWT 令牌。
  3. 使用基于 JWT 的中间件保护路由。

JWT 是一种处理身份验证的强大方法,使您的 Web 应用程序既安全又可扩展。

以上是在 Web 应用程序中创建和保护 JWT 身份验证的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板