Node.js 是一个强大且流行的服务器端 JavaScript 运行环境,它提供了许多便捷的工具和库,用于开发高效的 Web 应用程序。与此同时,JSON Web Tokens (JWT) 成为了一种简单、安全、灵活的身份验证和授权机制。
在本篇文章中,我们将深入 Node.js 和 JWT 的工作原理,并使用示例代码演示如何用 Node.js 和 JWT 实现身份验证和授权。
什么是 JWT?
JSON Web Tokens 是一种在客户端和服务器端之间传输信息的安全机制。JWT 格式的数据是一个由三部分组成的字符串,它们用点号分隔开:
-----------------
其中:
头部(Header):JWT 的头部通常包含两部分,第一部分是 token 的类型,这里使用 JWT。第二部分是所使用的算法,例如 HS256 或 RS256 等等。
载荷(Payload):一般是包含了用户信息、发放时间(issued at)、过期时间(expires)、作用域(scope)、颁发者(issuer)等信息。
签名(Signature):为了验证数据的完整性,数字签名是必不可少的。将头部和载荷的内容结合起来,再加上我们的密钥(secret),通过指定的算法进行签名,生成签名字符串。
JWT 的主要优势在于其灵活性和自包含性。因为所以 JWT 包含了自身的签名,因此在 JWT 发放时无需在服务器存储状态信息。这使得 JWT 可以在不同的服务器上进行交易,并且无需进行同步。
Node.js 上的 JWT 的工作方式
Node.js 上使用 JWT 的方式与其他语言和框架并没有太大的不同。我们可以使用 jsonwebtoken 库来生成、验证和解码 JWT。下面是一个示例:
----- --- - ------------------------ ----- --------- - --------- ----- ------- - - --------- -------- ----- ------- -- ----- ----- - ----------------- ----------- -------------------
在上面的示例中,我们导入了 jsonwebtoken 库,使用 sign 方法生成包含给定信息的 JWT。然后我们使用 secretKey 进行签名。
接下来,我们想要解码这个令牌,可以使用 verify 方法:
----- ------- - ----------------- ----------- ---------------------
上述代码将返回一个对象,包含了所包含的用户名和角色。
在 Node.js 中使用 JWT 进行身份验证
接下来,我们将演示如何将 JWT 用作身份验证机制。
假设我们有一个包含登录、注册和个人资料页面的网站。用户在登录时,会提交他们的用户名和密码。为了验证用户的身份,我们需要进行以下步骤:
-查找 MongoDB 中是否存在此用户的记录。 -如果用户存在,将其 ID 和其他信息存储在 JSON 对象中。 -使用 jsonwebtoken 库、签名密钥、信息 JSON 和一些选项(例如过期时间)来生成 JWT。 -将 JWT 返回给客户端。
现在,在用户访问个人资料页面时,我们需要验证他们是否已经登录。我们可以使用中间件将 JWT 配置为需要验证:
----- --- - ------------------------ ----- ---- - ----- ---- ----- -- - ----- ----- - ------------------------------------------- -- ---- ----- --------- - --------- --- - ----- ------- - ----------------- ----------- -------- - -------- ------- - ----- ----- - ----------------- ---------------------- ------ ---- ---------- -- ------ ---- --------- --- - - -------------- - -----
在上述代码中,我们创建了一个 auth 函数,用于从 HTTP 标头中提取令牌,并使用 jsonwebtoken 库校验它。如果令牌无法校验,将返回未验证的表单。
现在,我们可以将此 auth 函数配置为我们个人资料页面的中间件,以确保用户已登录并具有适当的权限。
----- ------- - ------------------- ----- ---- - ----------------------------- ----- --- - ---------- ------------------- ----- ----- ---- -- - ------------------- ---
在上述代码中,我们使用 Node.js 的 express 库创建一个应用程序,当 /profile 路由标识请求时,通过 auth 中间件验证用户是否登录,并在通过时发送包含用户信息的 JSON 响应。在未通过身份验证之前,此路由将返回未验证的表单。
在 Node.js 中使用 JWT 进行授权
JWT 不仅在身份验证中非常有用,它在授权方面也非常有用。
假设我们有一个后台管理员可以查看并删除帖子的用户。我们可以使用 JWT 将权限信息存储在载荷中,并针对不同用户类型(例如管理员和普通用户)分配不同的 JWT:
----- --- - ------------------------ -- --- ----- ------------ - - --------- -------- ----- ------- -- ----- ---------- - ---------------------- ---------- - ---------- ---- ---
在上述代码中,我们创建了一个 adminPayload 对象,该对象包含管理员的信息和角色。我们使用 jsonwebtoken 库、签名密钥和其他选项,例如过期时间,创建一个包含这些信息的 JWT。在这种情况下,我们将其在有效期内恒定为 1 小时。
现在,我们可以通过修改我们上面演示的 auth 中间件来检查用户是否拥有适当的角色:
----- ---- - ----- ---- ----- -- - ----- ----- - ------------------------------------------- -- ---- ----- --------- - --------- --- - ----- ------- - ----------------- ----------- -- ------------- --- -------- - -------- - -------- ------- - ---- ---------------------- ------ ---- ---------- -- ------ ---- --------- --- - ----- ----- - ----------------- ---------------------- ------ ---- ---------- -- ------ ---- --------- --- - -
在上述代码中,我们检查使用 Bearer 方案的 HTTP 令牌(与身份验证中的相同)是否包含与“管理员”(即“admin”角色)相关的字串。如果是,则 next() 函数被调用,让请求通过继续执行。否则,将返回具有 401 响应状态代码的 JSON。
结论
在本文中,我们演示了如何使用 Node.js 和 JWT 实现身份验证和授权机制。我们详细介绍了 JWT 的作用和工作原理,并展示了如何使用 jsonwebtoken 库将 JWT 用于 Node.js 中。
在实际应用中,JWT 提供了一种安全、简单和灵活的身份验证和授权方案。它的自包含性和与 Node.js 的兼容性使其适用于多个 Web 应用程序场景。
示例代码:https://github.com/yhzheng/Node.js-and-JWT
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671b69919babaf620fab482e