随着 Web 应用程序的流行和复杂性的增加,认证和授权已经变得越来越重要。许多 Web 应用程序要求用户进行身份验证,以便他们可以访问应用程序的功能和资源。此外,某些用户可能具有对某些资源进行更改的权限,而其他用户则不具备这些权限。在这种情况下,授权非常有用,它可以确保只有具有适当权限的用户才能对资源进行更改。
本文将介绍如何使用 Mongoose 和 Express 的中间件进行认证和授权。我们将创建一个简单的 Web 应用程序,并使用 Passport 中间件进行身份验证,使用 JSON Web Token(JWT)进行授权。此外,我们还将使用 Mongoose 来管理用户和资源数据。
一、基本要求
- Node.js
- MongoDB
- NPM
二、项目初始化
首先,我们需要创建一个新的 Node.js 项目。在命令行中输入以下内容:
$ mkdir myapp $ cd myapp $ npm init -y
接下来,安装以下依赖项:
$ npm install --save express passport passport-local jsonwebtoken mongoose
- express:Web 应用程序框架
- passport:身份验证和登录管理器
- passport-local:Passport 的 LocalStrategy
- jsonwebtoken:JSON Web Tokens 的实现
- mongoose:MongoDB 的对象数据建模库
三、创建 Mongoose 模型
我们需要使用 Mongoose 创建两个模型:
- 用户模型(用于用户身份验证)
- 资源模型(用于授权)
在 models 目录下创建 user.js 和 resource.js 文件。
1. user.js
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------ - ------------------ ----- ---------- - --- ----------------- --------- - ----- ------- --------- ----- ------- ---- -- --------- - ----- ------- --------- ---- - --- ---------------------- -------- ------ - ----- ---- - ----- -- ------------------------------ - ------ ------- - ------------------ ----- ----- -- - -- ----- - ------ ---------- - -------------------------- ----- ----- ----- -- - -- ----- - ------ ---------- - ------------- - ----- ------- --- --- --- ---------------------------------- - -------- ------------------- --------- - --------------------------------- -------------- ----- -------- -- - -- ----- - ------ -------------- - -------------- --------- --- -- -------------- - ---------------------- ------------
2. resource.js
const mongoose = require('mongoose'); const resourceSchema = new mongoose.Schema({ name: { type: String, required: true }, userId: { type: mongoose.Schema.Types.ObjectId, required: true, ref: 'User' } }); module.exports = mongoose.model('Resource', resourceSchema);
四、创建 Express 应用程序
在应用程序根目录下创建 app.js 文件,并添加以下代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- -------- - -------------------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ----- ---------- - ----------------------- ----- --- - ------------------------ ----- ---- - ------------------------- ----- -------- - ----------------------------- --------------------------------------------- - ---------------- ---- --- ----- --- - ---------- --------------------------- ------------------------------- ---------------- ------------------------ --------- ----- -- - -------------- -------- -- ----- ----- -- - -- ----- - ------ ---------- - -- ------- - ------ ---------- ------ - -------- ----- --- ------ --- - ------------------------------ ----- -------- -- - -- ----- - ------ ---------- - -- --------- - ------ ---------- ------ - ---- - ------ ---------- ------ - -------- ---------- --------- --- - --- --- ---- ------------------ ----- ---- ----- -- - ------------------------------ ----- ----- ----- -- - -- ----- - ------ ---------- - -- ------- - ------ ---------------------- -------- ------------ --- - --------------- - -------- ----- -- ----- -- - -- ----- - ------ ---------- - ----- ----- - ---------- ------- -------- -- ---------- ------ ---------- ----- --- --- ------- ---- ------ --- ---------------------- ---------------------------- - -------- ----- --- ----- ---- -- - ----- -------- - --- ---------- ----- -------------- ------- ------------ --- ------------------- -- - -- ----- - ------ ---------------------- -------- ----------- --- - ------ ------------------- --- --- --------------------- ---------------------------- - -------- ----- --- ----- ---- -- - --------------- ------- ------------ -- ----- ---------- -- - -- ----- - ------ ---------------------- -------- ----------- --- - ------ -------------------- --- --- ---------------- -- -- - ---------------- --------- -- ---- ------- ---
在应用程序中,我们使用了 Express 和 Passport 模块来处理认证和授权。我们定义了一个 /login 路由,该路由使用 LocalStrategy 从 MongoDB 数据库中验证用户提供的用户名和密码。成功认证登录之后,我们使用 JWT 返回一个签名的令牌。
我们还为 /resources 和 /resources/:id 定义了路由,这些路由需要一个有效的 JWT 才能访问。如果请求不包含有效的 JWT,则 Passport 会停止处理请求并返回一个 401 状态代码。
五、测试
在命令行中启动应用程序:
$ node app.js
要测试我们的应用程序,请使用任何 HTTP 客户端,例如 Postman 或 cURL。
首先,您需要创建新用户。在 Postman 中创建一个请求:
- 地址:POST http://localhost:3000/users
- Body:user 和 password 字段
总结:本文介绍了如何使用 Mongoose 和 Express 的中间件进行简单的身份验证和授权。我们利用了 Passport 中间件来处理身份验证,并使用 JWT 来进行用户授权。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646c5768968c7c53b0b55767