在 Web 应用程序中,用户认证和授权是非常重要的功能。用户认证是指验证用户身份,以确保他们有权访问应用程序的特定部分。授权是指确定用户有权访问哪些资源。
Express.js 是一种流行的 Node.js 框架,它可以帮助我们快速构建 Web 应用程序。在本文中,我们将探讨如何使用 Express.js 实现用户认证和授权。
用户认证
用户认证是一个多步骤的过程。我们需要验证用户提供的凭据,以确保他们是合法的用户。凭据可以是用户名和密码、电子邮件和密码、或其他任何标识符。我们将使用 Passport.js 来管理用户认证。
安装 Passport.js
首先,我们需要安装 Passport.js 和相关的模块:
npm install passport passport-local passport-jwt bcryptjs jsonwebtoken
这些模块包括:
passport
:认证中间件passport-local
:本地策略,用于验证用户名和密码passport-jwt
:JSON Web Token(JWT)策略,用于验证用户的 JWTbcryptjs
:密码哈希库,用于加密和解密密码jsonwebtoken
:JWT 库,用于创建和验证 JWT
配置 Passport.js
我们需要配置 Passport.js,以便它可以使用本地策略和 JWT 策略。我们将在 app.js
文件中进行配置。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ----- ----------- - --------------------------------- ----- ---------- - ----------------------------------- ----- ------ - -------------------- ----- ---- - ------------------------- ----- ------------- - --- -------------- - -------------- ------- -- ----- ------- --------- ----- -- - --- - ----- ---- - ----- -------------- ----- --- -- ------- - ------ ---------- ------ - -------- ---------- ------- --- - ----- ------- - ----- ------------------------ --------------- -- ---------- - ------ ---------- ------ - -------- ---------- ---------- --- - ------ ---------- ------ - ----- ----- - ------ ---------- - - -- ----- ---------- - - --------------- ----------------------------------------- ------------ ----------------------- -- ----- ----------- - --- ----------------------- ----- ------------ ----- -- - --- - ----- ---- - ----- ----------------------------- -- ------- - ------ ---------- ------ - -------- -------- ------- --- - ------ ---------- ------ - ----- ----- - ------ ---------- - --- ---------------------------- --------------------------
这里我们定义了两个策略:
localStrategy
:使用本地策略验证用户名和密码jwtStrategy
:使用 JWT 策略验证用户的 JWT
用户注册和登录
我们需要创建一个用户模型和一些路由来处理用户注册和登录。在这里,我们将使用 MongoDB 作为我们的数据库。
用户模型
我们将创建一个简单的用户模型,其中包含用户的电子邮件和密码哈希。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------ - -------------------- ----- ---------- - --- ----------------- ------ - ----- ------- --------- ----- ------- ---- -- --------- - ----- ------- --------- ---- -- --- ---------------------- ----- -------- ------ - --- - ----- ---- - ----- ------------------- ----- ---- - ----- -------------------------- ------ ------------- - ----- ------- - ----- ----- - ---------- - --- ----- ---- - ---------------------- ------------ -------------- - -----
这里我们使用了 Mongoose,一个 Node.js 的 MongoDB 驱动程序。我们还使用了 bcryptjs,一个密码哈希库,用于加密和解密密码。
在 userSchema.pre('save')
钩子函数中,我们使用 bcryptjs 生成一个哈希值,并将其存储在数据库中。
用户注册
现在我们可以创建一个路由来处理用户注册。在这里,我们将使用 Express.js 中的 body-parser
中间件来解析请求正文中的 JSON 数据。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- ---- - ------------------------- ----- --- - ---------- --------------------------- --------------------- ----- ----- ---- ----- -- - --- - ----- ---- - --- --------------- ----- ------------ --------------- - ----- ----- - ---------- - ---
这里我们使用了 User
模型来创建一个新用户,并将其保存在数据库中。如果保存成功,我们将返回用户数据。
用户登录
现在我们可以创建一个路由来处理用户登录。在这里,我们将使用 Passport.js 来验证用户名和密码,并创建一个 JWT。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- -------- - -------------------- ----- --- - ------------------------ ----- ---- - ------------------------- ----- --- - ---------- --------------------------- ------------------------------- ------------------ ----- ----- ---- ----- -- - ------------------------------ ----- ----- ----- ----- -- - --- - -- ----- - ------ ---------- - -- ------- - ------ ---------------------- -------- ------------ --- - ----- ----- - ---------- --- -------- -- ------------------------ ---------- ----- --- - ----- ----- - ---------- - ------- ---- ------ ---
这里我们使用了 Passport.js 的 passport.authenticate()
方法来验证用户名和密码。如果验证成功,我们将创建一个 JWT,并将其返回给客户端。
用户授权
现在我们已经实现了用户认证,下一步是用户授权。我们需要确定哪些用户有权访问哪些资源。在这里,我们将使用 JSON Web Token(JWT)来管理用户授权。
配置 JWT
我们需要配置 JWT,以便它可以从请求头部中提取 JWT,并验证它是否有效。我们将在 app.js
文件中进行配置。
-- -------------------- ---- ------- ----- ---------- - - --------------- ----------------------------------------- ------------ ----------------------- -- ----- ----------- - --- ----------------------- ----- ------------ ----- -- - --- - ----- ---- - ----- ----------------------------- -- ------- - ------ ---------- ------ - -------- -------- ------- --- - ------ ---------- ------ - ----- ----- - ------ ---------- - --- --------------------------
这里我们定义了一个 JWT 策略,并将其添加到 Passport.js 中。我们还指定了 JWT 的来源和密钥。
路由保护
现在我们可以创建一些需要授权才能访问的路由。在这里,我们将使用 passport.authenticate()
方法来验证 JWT。
const express = require('express'); const passport = require('passport'); const app = express(); app.get('/protected', passport.authenticate('jwt', { session: false }), (req, res) => { res.json({ message: 'Access granted.' }); });
这里我们使用了 passport.authenticate()
方法来验证 JWT。如果验证成功,我们将返回受保护的资源。
总结
在本文中,我们探讨了如何使用 Express.js 实现用户认证和授权。我们使用了 Passport.js 管理用户认证,并使用 JWT 管理用户授权。我们还创建了一些需要授权才能访问的路由,并保护了它们。这些技术可以帮助我们创建更安全、更可靠的 Web 应用程序。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66193a87d10417a222a14ac0