引言:为什么 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/callbackconst 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 = '您的密钥