随着 Web 应用的普及,用户身份验证和授权成为了应用开发的必要步骤。传统的基于 session 的身份验证已经不再适用于现代应用的需求,因为 session 跨站点状态管理比较麻烦,而且需要在服务器端维护会话,带来了很大的开销。JWT(JSON Web Token)是一种基于 token 的身份验证方式,它可以在客户端存储身份验证信息,减轻了服务器端的负担。本文将介绍如何使用 Node.js 实现基于 JWT 的身份验证和授权。
什么是 JWT?
JWT 是一种基于 token 的身份验证方案,它使用 JSON 数据格式存储用户信息,并使用签名保证安全性。JWT 由三部分组成:
- Header:存储加密算法和其他元数据的对象。
- Payload:存储用户信息的对象。
- Signature:存储签名的字符串。
JWT 可以在客户端存储,通常放在 LocalStorage 或者 Cookie 中。客户端将 JWT 发送到服务器进行身份验证,在服务器端通过验证 JWT 的签名来确认用户是否有权限访问。
实现 JWT 身份验证
基于 JWT 的身份验证流程如下:
- 用户进行身份验证,将用户名和密码提交到服务器。
- 服务器认证用户身份,生成 JWT 并返回给客户端。
- 客户端保存 JWT,每次请求时将 JWT 发送到服务器。
- 服务器验证 JWT,如果 JWT 有效,则返回对应资源,否则返回错误信息。
在 Node.js 中使用 JWT 需要先安装 jsonwebtoken
模块。
npm install jsonwebtoken
下面是一个使用 JWT 进行身份验证的例子。
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ------- - ------------------- ----- ---------- - ----------------------- ----- --- - ---------- --------------------------- -- -- ---------------- ------ ----- ----- - - - --- -- --------- -------- --------- ------- -- - --- -- --------- ------- --------- ------ - -- ----- ------ - ----------------- -- --- ---- -- ---- ------------------ ----- ---- -- - ----- - --------- -------- - - --------- ----- ---- - ------------ -- ---------- --- -------- -- ---------- --- ---------- -- ------ - -- -- --- ----- ----- - ---------- --- -------- --------- ------------- -- -------- ---------- ----- --- - ---- - ---------------------- ------ ----------- --- - --- -- -------- --------------------- ----- ---- -- - -- ------ --- ----- ---------- - -------------------------- -- ------------ - -- -- --- ----- ----- - ------------------ ------ ----------------- ------- ----- -------- -- - -- -- --- -- -- ----- - ---------------------- ------ ---- ---- --- - ---- - ---------- -------- ------- - - ---------------- --- - --- - ---- - ---------------------- ------ ---- ---- --- - --- ---------------- -- -- - ------------------- --------- -- ------------------------ ---
这个例子中,我们定义了两个接口 /login
和 /protected
。
/login
接口接收用户名和密码,认证用户身份,并生成 JWT 发送给客户端。如果验证失败,则返回 401 状态码。/protected
用于获取受保护的资源,它会检查请求头中是否包含 JWT,如果包含 JWT,则解析并进行签名验证。如果 JWT 有效,则返回资源的内容,否则返回 401 状态码。
实现 JWT 授权
除了身份验证,我们还需要授权机制来限制用户能否访问某些资源。JWT 授权是基于角色或权限的,可以使用一个字段来表示用户的角色或权限。
在 Node.js 中可以使用中间件来实现 JWT 授权。下面是一个使用 JWT 进行授权的例子。
-- -------------------- ---- ------- -- ------- ----- - ------ -- ------- -- -------- ---------------- - ------ ----- ---- ----- -- - -- ------ --- ----- ---------- - -------------------------- -- ------------ - -- -- --- ----- ----- - ------------------ ------ ----------------- ------- ----- -------- -- - -- ----- - ---------------------- ------ ---- ---- --- - ---- - -- ---------- -- ------------------------------ - -- ----- ---------- -------- - -------- -- ---------- ------- -- ----------------- - ---- - ---------------------- ------ ------ --- - - --- - ---- - ---------------------- ------ ---- ---- --- - -- - -- --------- ----------------- --------------------- ----- ---- -- - -- --- --- -- ---------- ---------------- -------------------- ----- ---- -- - -- --- ---
这个例子中,我们定义了一个中间件 authorize
用于授权。authorize
函数接收一个角色列表作为参数,返回一个中间件函数。中间件函数会从请求头中获取 JWT,解析并进行签名验证,然后对比用户的角色和角色列表是否符合要求,如果符合则保存已认证的用户信息,并继续执行下一个中间件或路由处理函数。否则返回 403 状态码。
我们可以在路由处理函数中使用 req.user
来获取已认证的用户信息。
app.get('/admin', authorize(['admin']), (req, res) => { const user = req.user; res.json({ message: 'Hello, ' + user.username }); });
总结
本文介绍了如何使用 Node.js 实现基于 JWT 的身份验证及授权。JWT 身份验证可以减轻服务器的负担,而 JWT 授权可以提供精细的权限控制。这对于开发大型 Web 应用来说至关重要,希望本文对大家有所帮助。下面是本文的代码示例:
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ffdc4295b1f8cacde2356d