当我们在开发使用 Express.js 的 Web 应用程序时,安全性是一个非常重要且需要考虑的问题。要确保只有经过身份验证的用户才能访问受保护的资源,我们需要使用身份验证和授权来控制用户的访问权限。在本文中,我们将介绍如何在 Express.js 中使用 Passport.js 和 JSON Web Token(JWT)来实现身份验证。
Passport.js 是一个广泛使用的 Node.js 身份验证中间件,它支持数百种身份验证策略,包括本地用户名和密码,社交媒体身份验证和OpenID等。JSON Web Token(JWT)是一种用于安全地交换信息的开放标准,它使用 JSON 对象进行声明,经过加密后可以安全地在用户和服务器之间传输数据。
安装和设置 Passport.js
要在 Express.js 中使用 Passport.js,我们首先需要安装它。我们可以使用 npm 安装它:
npm install passport --save
接着我们需要在我们的 Express.js 应用中配置 Passport.js。我们需要添加以下代码:
-- -------------------- ---- ------- --- -------- - -------------------- --- --- - ---------- -- --- --- -------- ---------- ------------------------------- -- --- -- -------- ---------- --- ------------- - ----------------------------------- ---------------- --------------- -------------- -------- --------------- ----------- ------------------- ---- -- -------- ----- ------ --------- ----- - --- --------- --- ----- --- -------- ----- --- -------- ----展开代码
在上面的代码中,我们首先require Passport.js作为变量"passport"。然后,我们将其middleware配置通过使用express中use()方法初始化。 接下来,我们添加本地策略(localStrategy),并将其传递给Passport.js。
加密密码
在对密码进行身份验证之前,应将其加密,以确保数据的安全性。在Node.js中,bcrypt模块是最常用的模块之一,它可以将密码加密为安全的hash。我们可以使用下面的代码进行加密:
var bcrypt = require('bcrypt'); var password = 'myPassword'; bcrypt.hash(password, 10, function(err, hash) { // Store hash in the database });
在上面的代码中,我们使用bcrypt.hash()方法来进行密码处理。第二个参数10表示加盐密码的强度。处理完密码后,我们可以将其保存到数据库中以供日后进行身份验证。
创建 JWT
要使用JWT在Express.js中实现身份验证,我们需要使用jsonwebtoken模块。我们可以使用以下代码创建JWT:
var jwt = require('jsonwebtoken'); var payload = { email: 'john@doe.com' }; var secret = 'mySecret'; var token = jwt.sign(payload, secret, { expiresIn: '1h' });
在上面的代码中,我们首先require 'jsonwebtoken'模块,然后创建JWT的“payload”数据(在这里我们只使用了一个email地址)。接着我们需要定义一个“secret”作为变量,该变量将用于加密 JWT。使用jwt.sign()函数,我们可以将我们的payload和加密密钥传递给 JWT 包生成器,并得到一个JWT。
我们可以指定JWT的过期时间,以确保安全性和保密性。在上面的代码中,我们指定JWT在一个小时之后过期(一小时后失效)。
使用JWT进行身份验证
要在 Express.js 中使用JWT进行身份验证,我们需要创建一个可重用的身份验证中间件。以下是示例代码:
-- -------------------- ---- ------- --- --- - ------------------------ --- ------ - ----------- --- ------------ - ------------- ---- ----- - -- --- --- --- ---- --- ------- --- ----- - -------------- -- --------------- -- ------------------------------ -- ------ --- --- ----- --- ------ --- -- ------- - ----------------- ------- ------------- -------- - -- ----- - ------ ---------- -------- ------ -------- ------- -- ------------ ------- --- - ---- - -- ---- ------- --- --- -- ----- ------ ----------- - -------- ------- - --- - ---- - ------ ---------------------- -------- ------ -------- --- ----- ---------- --- - -- -------------- - -------------展开代码
在上面的代码中,我们首先require 'jsonwebtoken'模块,并定义一个名为 "secret"的变量,用于解密 JWT。然后,我们定义了一个名为“authenticate”的中间件来执行身份验证。
该中间件需要在每次调用受保护的路由时进行身份验证。它从请求中获取 JWT,并使用secret密钥对其进行解码。如果JWT无效或已过期,则中间件将取消验证,并发送错误响应。
集成JWT和Passport.js
要同时使用JWT和Passport.js进行身份验证,我们需要将它们集成。以下是一个示例代码片段,可以在 Express.js 应用程序文件中使用它:
-- -------------------- ---- ------- --- --- - ------------------------ --- -------- - -------------------- --- ------------- - ----------------------------------- --- ------ - ----------- --- ------------ - ------------- ---- ----- - -- --- --- --- ---- --- ------- --- ----- - -------------- -- --------------- -- ------------------------------ -- ------ --- --- ----- --- ------ --- -- ------- - ----------------- ------- ------------- -------- - -- ----- - ------ ---------- -------- ------ -------- ------- -- ------------ ------- --- - ---- - -- ---- ------- --- --- -- ----- ------ ----------- - -------- ------- - --- - ---- - ------ ---------------------- -------- ------ -------- --- ----- ---------- --- - -- ---------------- --------------- -------------- -------- -------------- ----------- ------------------ ---- -- -------- ----- ------ --------- ----- - -- --------- --- ----- --- -------- ----- --- -------- - --- ------------------ ------------- ---- - ------------------------------ ------------- ----- ----- - -- ----- - ------ ---------- -------- ------ -------- --- --- - -- ------- - ------ ---------- -------- ------ -------- --------------- -------- --- - --- ----- - -------------- ------- - ---------- ---- --- ------ ---------- -------- ----- -------- --------------- ------------- ------ ----- --- ------- ----- --- --------------------- ------------- ------------- ---- - ------ ---------- -------- ----- -------- ---------- --------- --- ---展开代码
在上面的代码中,我们首先引入Passport.js 和 ‘jsonwebtoken’ 模块。接下来,我们设置签名密钥变量“secret”和一个认证中间件“authenticate”。
在我们的Express.js应用程序中,我们使用本地策略进行身份验证并定义“login”路由。当用户提供有效的凭据时,路由将生成一个JWT并将其作为响应返回。我们使用在“authenticate”中间件中定义的“authenticate”中间件来保护“/protected”路由,并以JSON格式返回受保护资源的消息。
总结
在本文中,我们看到了如何在 Express.js 中使用 Passport.js 和 JSON Web Token(JWT)来实现身份验证。首先,我们设置 Passport.js,其次,我们加密密码及创建 JWT,并定义一个可重用的身份验证中间件来支持使用JWT进行身份验证。最后,我们集成JWT和Passport.js进行身份验证,并定义登录和受保护的路由。
使用这些技术和方法,我们可以在 Express.js 中实现更安全和可靠的用户身份验证,并保护我们的Web应用程序免受黑客攻击和数据泄漏的威胁。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651c0e0195b1f8cacd3a1114