OAuth 2.0 和 JWT 授权在 JavaScript 中的应用:初学者完整指南

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

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

开始课程

引言:为什么 OAuth 2.0 和 JWT 是现代授权的标准



在现代 Web 开发中,用户的安全身份验证和授权是一项关键任务。解决此问题的两种最流行的协议和格式是 OAuth 2.0 和 JWT(JSON Web Token)。尽管它们经常一起使用,但它们是不同的东西:OAuth 2.0 是一种访问委派协议,而 JWT 是一种令牌格式。



在本文中,我们将分析 OAuth 2.0 的工作原理、什么是 JWT,以及如何在 JavaScript (Node.js) 中实现它们。本材料面向初学者开发者,因此我们将从理论到实践,通过清晰的代码示例逐步推进。



什么是 OAuth 2.0 以及它是如何工作的



OAuth 2.0(开放授权)是一种协议,允许应用程序在不传递用户登录名和密码的情况下,获得对用户资源的有限访问权限。想象一下,您想通过 Google 或 GitHub 登录一个网站——这就是 OAuth 2.0。



OAuth 2.0 中的主要角色

  • 资源所有者 — 拥有数据的用户
  • 客户端 — 请求访问的应用程序
  • 授权服务器 — 颁发令牌的服务器(例如 Google)
  • 资源服务器 — 存储用户数据的服务器


授权码授权流程(以 Node.js 为例)

最常用且最安全的 OAuth 2.0 流程是授权码授权。让我们看看如何使用 Express.js 实现它。



// 安装依赖// npm install express axios dotenv

// .envCLIENT_ID=your_client_idCLIENT_SECRET=your_client_secretREDIRECT_URI=http://localhost:3000/callback


const express = require('express');const axios = require('axios');require('dotenv').config();

const app = express();

// 步骤 1:将用户重定向到授权页面app.get('/auth', (req, res) => { const authUrl = `https://provider.com/oauth/authorize?client_id=${process.env.CLIENT_ID}&redirect_uri=${process.env.REDIRECT_URI}&response_type=code&scope=email`; res.redirect(authUrl);});

// 步骤 2:处理带有授权码的回调app.get('/callback', async (req, res) => { const { code } = req.query;

try { // 将授权码交换为访问令牌 const tokenResponse = await axios.post('https://provider.com/oauth/token', { client_id: process.env.CLIENT_ID, client_secret: process.env.CLIENT_SECRET, code, redirect_uri: process.env.REDIRECT_URI, grant_type: 'authorization_code' });

const { access_token, refresh_token } = tokenResponse.data; // 保存令牌(在实际项目中保存到数据库) req.session.accessToken = access_token; req.session.refreshToken = refresh_token;

res.send('授权成功!'); } catch (error) { res.status(500).send('授权错误'); }});

app.listen(3000, () => console.log('服务器在端口 3000 上启动'));


JWT(JSON Web Token):结构与创建



JWT 是一种以 JSON 对象形式在各方之间传递信息的紧凑且自包含的方式。令牌由三部分组成,用点分隔:



  • Header — 令牌类型和签名算法(例如 HS256)
  • Payload — 我们要传递的数据(声明)
  • Signature — 确保数据完整性的签名


在 Node.js 上创建 JWT

为了使用 JWT,我们将使用 jsonwebtoken 库。



// npm install jsonwebtoken

const jwt = require('jsonwebtoken');

const secretKey = '您的密钥

博客

书籍推荐