简介
byu-jwt 是一个用于解析和验证 JSON Web Token (JWT) 的 Node.js 模块。JWT 是一个轻量级的身份认证和授权协议,可以在跨域场景下传输数据和验证身份。
本文将介绍如何使用 byu-jwt 模块。
安装
在命令行中输入以下命令即可安装 byu-jwt:
npm install byu-jwt
使用
以下是一个简单的使用示例:
-- -------------------- ---- ------- ----- --- - ------------------- ----- ----------- - ------------------------------------------------------------------------------------------------------------------------------------------------------------- ----- ------ - -------- ----- ------------------ - ----------------------- ------- -------------------------------
以上代码将输出:
{ sub: '1234567890', name: 'John Doe', iat: 1516239022 }
API
byu-jwt 模块提供了以下 API:
decode(token, secret)
: 解码 JWT 并返回一个对象,可以从对象中提取出所需的信息,例如用户 ID 和其他的元数据。verify(token, secret)
: 验证 token 的签名是否正确并返回一个布尔值。如果签名正确,返回 true;否则返回 false。sign(payload, secret)
: 签发一个 JWT 并返回一个字符串,可以将该字符串返回给客户端,客户端可以将其保存在 cookie 或 localStorage 中。refresh(token, secret)
: 刷新一个 JWT 并返回一个新的 JWT。刷新操作通常用于更新 token 上的一些元数据,例如刷新 token 的过期时间。
示范
下面我们将提供一个完整的示例来演示如何使用 byu-jwt 来实现认证。这个示例将建立一个可登录和注销的网站。该示例要求用户输入他们的用户名和密码以进行身份验证。如果验证成功,将向用户发放一个 JWT。该网站的其他页面将检查用户是否已经登录,并根据其登录状态显示不同的内容。
启动服务器
首先,我们要启动一个简单的 Node.js 服务器。我们将使用 Express.js。
npm install express body-parser cookie-parser
-- -------------------- ---- ------- ----- ------- - ------------------ ----- ---------- - ---------------------- ----- ------------ - ------------------------ ----- --- - --------- -------------------------- ----------------------- ---------------- -------- -- - ------------------- ------- -- ---- ------ --
注册和登录
现在我们创建一个 HTML 页面,其中包含注册和登录表单。
-- -------------------- ---- ------- --------- ----- ------ ------ --------------------- ------------ ------- ------ ------------------ --------- -------------- ----- ---------------- ----- ------ -------------------------- ------ ------------ ---------- -------------- ------ ----- ------ -------------------------------- ------ --------------- ------------- ----------------- ------ ----- ------- ---------------------------- ------ ------- ----------------- ----- ------------------- ----- ------ ------------------------ ------ ----------- --------- ------------ ------ ----- ------ -------------------------- ------ ------------ ---------- ------------- ------ ----- ------ -------------------------------- ------ --------------- ------------- ---------------- ------ ----- ------- ------------------------------- ------ ------- ------- --------------------------- ------- -------
接下来,我们将在服务器上创建用于处理注册和登录表单的路由。
app.post('/register', function (req, res) { // TODO: Implement registration }) app.post('/login', function (req, res) { // TODO: Implement authentication })
现在,我们可以实现注册和登录的逻辑。
-- -------------------- ---- ------- ----- ----- - -- --------------------- -------- ----- ---- - ----- - ----- ------ -------- - - -------- -- ------------------ -- ------- --- ------ --- --- - ------ -------------------------- ------- ------------ - ------------ ----- ------ -------- -- --------------------- ------------ -- ------------------ -------- ----- ---- - ----- - ------ -------- - - -------- ----- ---- - ------------ -- ------- --- ----- -- ---------- --- --------- -- ------- - ------ ---------------------------- ----- -- ---------- - ----- ------ - --- ------- ----- ----- - ---------- ----- -- ------- ----------------- ------ - --------- ---- -- -------------- ------------ --
我们检索用户仅基于其电子邮件和密码。在现实世界中,这种方式很容易受到攻击。可能更好的方法是使用密码哈希和 salting。
当用户登录成功时,我们签发一个新的 JWT 并将其添加到用户的 cookies 中。这个 JWT 是通过假设电子邮件地址是可以唯一标识用户的来签发的。这个假设有一些与现实不匹配的地方,比如有多个用户注册了相同的电子邮件地址,或者用户在更改电子邮件地址后忘记更新旧权限。
鉴定身份
现在我们已经有了一个可登录的网站,我们必须对它进行身份验证才能防止任何人未经授权地访问它。以下是一个授权的路由,只允许已经登录的用户访问:
-- -------------------- ---- ------- ------------------- ----------- -------- ----- ---- - ---------------- -- ---- --------- -- -------- --------------- ---- ----- - ----- ----- - --------------- -- -------- - ------ ------------------------ ---- -- ----- ------- - ----- ------ - --- ------- --- - ----- ------- - ----------------- ------- -------- - ------- ------ - ----- ----- - ---------------------------- ------- - -
我们使用 isLoggedIn
中间件来检查用户是否已经登录,每次请求都会调用该中间件。在这个例子中,如果用户未登录,我们会直接返回 401 状态码。如果用户已登录,则从 cookie 中读取 JWT 并对其进行验证。只有在 JWT 有效的情况下,用户才能访问他们的个人资料页面。
注销
最后,为了实现注销功能,我们只需要从 cookie 中删除 JWT。
app.get('/logout', function (req, res) { res.clearCookie('jwt') res.redirect('/') })
总结
本文介绍了如何使用 byu-jwt 模块,以实现身份验证和授权。虽然 JWT 是一种非常流行的身份验证方式,但它并不适用于所有应用场景。您应该评估、选择和实现最适合您应用程序需求的身份验证方案。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5eedbbf5b5cbfe1ea06119bc