在 Express.js 项目中,鉴权和授权是非常重要的一环。实现一个健壮的鉴权和授权系统,能够确保你的应用程序只给被授权的用户提供访问权限。本文将详细介绍在 Express.js 项目中实现鉴权和授权的方法。
鉴权和授权的区别
在开始讨论如何在 Express.js 项目中实现鉴权和授权之前,让我们先了解一下这两个术语的含义。
- 鉴权:确保某个用户是合法的用户,具有访问某个资源的权限。
- 授权:根据用户的身份和角色,决定该用户是否有权访问某个资源。
简单说来,鉴权是验证用户身份的过程,而授权是决定用户是否有权访问某个资源的过程。
在 Express.js 中实现鉴权和授权
在 Express.js 中实现鉴权和授权,主要可以通过两种方式实现:session 和 token。
Session-based 身份验证
使用 Session-based 身份验证的方法,主要包括以下几个步骤:
- 用户向服务器发送登录请求。服务器验证用户的身份,如果验证通过会在服务器端创建一个 session 对象。
- 服务器端返回登录成功后的响应,同时将 session ID 在 Set-Cookie 中返回给客户端。
- 对于每一个后续请求,客户端都会将 session ID 带在 Cookie 中发给服务器,服务器可以通过该 session ID 找到对应的 session 对象。
- 服务器端根据 session 对象中存储的用户信息去判断用户是否有权限访问请求的资源。
以下是一个在 Express.js 中使用 session-based 鉴权的示例:
const express = require('express'); const session = require('express-session'); const app = express(); // 使用 session 中间件 app.use(session({ secret: 'some_secret_key', resave: false, saveUninitialized: true, cookie: { httpOnly: true, secure: true, maxAge: 3600000 } })); // 用户登录操作 app.post('/login', (req, res) => { // 校验用户信息 const userInfo = { username: 'test', password: 'test123' }; if (req.body.username === userInfo.username && req.body.password === userInfo.password) { // 验证通过,设置 session req.session.userInfo = userInfo; res.json({ code: 0, msg: '登录成功' }); } else { // 验证失败 res.json({ code: 1, msg: '用户名或密码错误' }); } }); // 需要登录后才能访问的 API app.get('/user', (req, res) => { if (req.session.userInfo) { res.json({ code: 0, msg: '您已登录' }); } else { res.json({ code: 401, msg: '未登录' }); } });
Token-based 身份验证
使用 Token-based 身份验证的方法,主要包括以下几个步骤:
- 用户向服务器发送登录请求。服务器验证用户的身份,如果验证通过则生成一个 token,返回给客户端。
- 客户端在每个请求中将 token 作为一个参数或者放在请求头中发送给服务器。
- 服务器检查这个 token 是否是有效的,如果有效则允许用户访问请求的资源。
以下是一个在 Express.js 中使用 token-based 鉴权的示例:
const express = require('express'); const jwt = require('jsonwebtoken'); const app = express(); app.post('/login', (req, res) => { // 校验用户信息 const userInfo = { username: 'test', password: 'test123' }; if (req.body.username === userInfo.username && req.body.password === userInfo.password) { // 验证通过,生成 token const token = jwt.sign({ username: userInfo.username }, 'some_secret_key', { expiresIn: '1h' }); res.json({ code: 0, msg: '登录成功', token }); } else { // 验证失败 res.json({ code: 1, msg: '用户名或密码错误' }); } }); // 需要登录后才能访问的 API app.get('/user', (req, res) => { const token = req.headers.authorization.split(' ')[1]; // 获取 Authorization Header 中的 token try { const decoded = jwt.verify(token, 'some_secret_key'); res.json({ code: 0, msg: '您已登录' }); } catch (err) { res.json({ code: 401, msg: '未登录' }); } }); app.listen(3000, () => { console.log('Server started on port 3000'); });
总结
本文介绍了在 Express.js 项目中实现鉴权和授权的两种方法:session-based 和 token-based。无论是哪种方式,都需要严格校验用户的身份和权限,确保用户只能访问它们被授权的资源。希望读者们可以掌握本文介绍的内容,并在自己的项目中加以应用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659523bfeb4cecbf2d95ce1b