在 Web 应用程序中,安全是一项至关重要的任务。我们需要确保只有授权的用户才能访问敏感数据或执行某些操作。Express.js 是一种类似于 Node.js 框架,它可以帮助我们构建服务器端应用程序。在这篇文章中,我们将深入学习如何在 Express.js 中实现身份验证和授权,使用 Passport.js 和 JSON Web Tokens。
为什么我们需要身份验证和授权?
在任何 Web 应用程序中,特别是那些涉及信任和安全的应用程序中,身份验证和授权是两个非常重要的概念。
简单来说,身份验证是确保一个用户是谁他声称自己的过程。如果他可以成功地通过身份验证,我们可以确定他的身份,并允许他进行特定的操作。
授权是确保一个用户拥有哪些权利或权限的过程。基于他的身份,我们可以通过授权来决定他可以访问哪些资源或执行哪些操作。
身份验证和授权通常是用于保护敏感数据和操作(如密码、个人资料、付款等)不受未经授权的访问。
使用 Passport.js 进行身份验证
Passport.js 是一个流行的身份验证库,他使用策略模式来支持多种身份验证方式,包括本地和第三方验证。让我们看一个使用本地验证的例子。
安装 Passport.js
使用 npm 命令安装 Passport.js
npm install passport passport-local
配置 Passport.js
在 app.js 文件顶部导入 Passport.js 和 Passport Local Strategy
const passport = require('passport'); const LocalStrategy = require('passport-local').Strategy;
在 app.js 文件中,我们需要将 Passport.js 初始化,使用 Express 的应用程序并将其作为应用程序中间件。这应该发生在定义路由之前。
app.use(passport.initialize());
现在让我们定义一个本地验证策略。
-- -------------------- ---- ------- ---------------- -------------- ------------------ --------- ----- - -------------- --------- -------- -- -------- ----- ----- - -- ----- - ------ ---------- - -- ------- - ------ ---------- ------- - -- -------------------------------- - ------ ---------- ------- - ------ ---------- ------ --- - ---
在本地验证策略中,我们首先在我们的用户存储库中查找传入的用户名,如果我们找到了一个用户,我们将它与传入的密码进行比较。如果我们发现密码与用户名不匹配,则不允许用户通过身份验证。
最后我们返回一个回调。如果用户成功通过身份验证,我们将传递进去用户的信息,否则回调返回失败。
配置 Express 应用程序路由
接下来,我们需要配置基于 Passport.js 的本地验证策略的路由。这个路由将接收 POST 请求,该请求包含用户凭据,以验证用户是否有权进行相应的请求。
app.post('/login', passport.authenticate('local'), function(req, res) { // If this function gets called, authentication was successful. // `req.user` contains the authenticated user. res.redirect('/users/' + req.user.username); });
在这个例子中,我们传递了本地验证策略名称 'local',这将导致 Passport.js 使用我们的本地验证策略来验证用户的凭据。
使用 Passport.js 来保护路由
现在,让我们看一个使用 Passport.js 来保护路由的例子。
app.get('/profile', passport.ensureAuthenticated, function(req, res) { res.render('profile', { user: req.user }); });
在这个例子中,我们定义了一个名为 'ensureAuthenticated' 的自定义中间件。该中间件通过检查用户是否已通过身份验证来保护受保护的路由。
passport.ensureAuthenticated = function(req, res, next) { if (req.isAuthenticated()) { return next(); } res.redirect('/login') };
在 ensureAuthenticated 中间件中,我们先检查用户是否已通过身份验证。如果用户已通过身份验证,我们直接调用 Express 的 next() 函数向下传递请求。否则,我们将他们重定向到我们的登录页面。
使用 JSON Web Tokens 进行授权
JSON Web Tokens(JWT)是一个用于跨域站点认证的开放标准,它通常用于在用户和服务器之间传递身份验证和授权信息。JWT 由三个部分组成:头部、有效载荷和签名。
头部是一个包含算法和类型的 JSON 对象。有效载荷包含我们要传递的有关用户的信息。签名是一个带有密钥的哈希算法,它用于验证有效载荷的完整性和身份。
以下示例显示了如何使用 JWT。
创建 JWT
创建一个 JWT 非常简单。我们只需要使用 jwt 库中的 sign 方法,并传递要在有效载荷中放置的信息和我们的密钥。
const jwt = require('jsonwebtoken'); const token = jwt.sign({ username: 'John Doe', isAdmin: true }, 'our-secret-key');
默认情况下,JWT 是无状态的。这意味着我们的服务器不需要在响应之间维护任何状态。
解密 JWT
接下来,我们需要确保使用我们的密钥和哈希算法来解密并验证我们的 JWT。
jwt.verify(token, 'our-secret-key', function(err, decoded) { console.log(decoded.username) // 'John Doe' console.log(decoded.isAdmin) // true });
在这个例子中,我们使用 verify 方法来验证我们的 JWT,并将其解密为内容对象。我们可以通过 decoded 对象访问有效载荷的信息。
将 JWT 传递到客户端
为了将 JWT 传递到客户端,我们可以将其存储在 Cookie 或 Authorization 头中,然后将其传递到每个请求中。以下代码示例展示了如何将 JWT 存储在 Authorization 头中。
app.use(function(req, res, next) { const token = req.headers.authorization; jwt.verify(token, 'our-secret-key', function(err, decoded) { if (!err) req.user = decoded; next(); }); });
在这个例子中,我们将 JWT 存储在 Authorization 头中,并使用 Express 中间件来解析和验证该标头。如果 JWT 有效,我们将有效载荷解码为 req.user 对象,从而使我们可以轻松地检查用户是否具有适当的权限。
结论
身份验证和授权对于任何 Web 应用程序都是必需的,它们有助于确保我们的应用程序是可信和安全的。在这篇文章中,我们学习了如何使用 Passport.js 和 JSON Web Tokens 在 Express.js 中实现身份验证和授权。此外,我们还提供了示例代码来加深理解。
现在我们已经知道了如何在 Express.js 中实现身份验证和授权,我们可以开始构建安全的 Web 应用程序。记住,您的应用程序只有在安全时才能为用户提供最佳体验。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670f386b5f55128102634e1d