OAuth 2.0 和 JWT 授权 JavaScript 完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

OAuth 2.0 和 JWT 授权在 JavaScript 中的介绍

现代 Web 应用程序需要可靠的认证和授权系统。两个最流行的标准——OAuth 2.0(访问委托协议)和 JWT(JSON Web Tokens)——通常一起使用来创建安全的 API。在本文中,我们将从零开始讲解如何在 JavaScript (Node.js) 中实现 OAuth 2.0 和 JWT 授权。

您将了解到:

  • 什么是 OAuth 2.0 以及为什么需要它
  • JWT 令牌如何工作
  • 如何在 Express 上配置授权服务器
  • 如何使用中间件保护路由

OAuth 2.0 基础:流程和角色

OAuth 2.0 定义了四个角色:Resource Owner(用户)、Client(应用程序)、Authorization Server(颁发令牌的服务器)和 Resource Server(提供数据的服务器)。最常见的流程是 Authorization Code Grant,用于 Web 应用程序。

在本文中,我们将专注于使用 JWT 实现 Resource Server 和 Authorization Server,而不是外部提供商(Google、GitHub)。这将让您完全控制整个过程。

安装依赖

首先,创建一个新的 Node.js 项目并安装必要的包:

npm init -y
npm install express jsonwebtoken bcrypt dotenv cors

包的说明:

  • express — 用于创建服务器的框架
  • jsonwebtoken — 创建和验证 JWT
  • bcrypt — 密码哈希
  • dotenv — 处理环境变量
  • cors — 为 API 配置 CORS

在 Node.js 上实现 JWT 授权

JWT 是一个紧凑的令牌,由三部分组成:头部、有效载荷 (payload) 和签名。我们将在用户成功登录后使用它进行身份验证。

配置服务器和用户模型

创建文件 server.js 并定义基本结构:

require('dotenv').config();
const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
const cors = require('cors');

const app = express();
app.use(express.json());
app.use(cors());

const PORT = process.env.PORT || 3000;
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';

// 临时用户存储(生产环境中请使用数据库)
const users = [];

注册和密码哈希

注册时,密码应使用 bcrypt 进行哈希处理:

app.post('/api/register', async (req, res) => {
    try {
        const { email, password } = req.body;
        
        // 检查用户是否已存在
        const existingUser = users.find(u => u.email === email);
        if (existingUser) {
            return res.status(400).json({ message: '用户已存在' });
        }

        // 密码哈希
        const hashedPassword = await bcrypt.hash(password, 10);
        const newUser = { id: users.length + 1, email, password: hashedPassword };
        users.push(newUser);

        res.status(201).json({ message: '用户已创建' });
    } catch (error) {
        res.status(500).json({ message: '服务器错误' });
    }
});

登录和生成 JWT 令牌

验证凭据后,使用 jsonwebtoken 生成令牌:

app.post('/api/login', async (req, res) => {
    try {
        const { email, password } = req.body;
        
        // 查找用户
        const user = users.find(u => u.email === email);
        if (!user) {                

博客

书籍推荐