在现代 Web 应用中,鉴别用户身份是必不可少的。为此,我们需要使用某种身份认证方法以确保用户是合法、已认证的。在这篇文章中,我们将讨论使用 JWT 进行身份认证。JWT 即 JSON Web Tokens,它是一个开放标准,被广泛地用于身份认证方案。
在本文中,我们将演示如何在 Express.js 应用中使用 JWT 进行身份认证。我们将讨论如何使用 JWT 创建令牌,如何在服务器端解码 JWT,以及如何控制路由器的访问权限。我们将通过一个具体的例子来说明如何实现。
安装和配置
首先,我们需要安装 jsonwebtoken
和 express-jwt
这两个 Node.js 模块。
npm install jsonwebtoken express-jwt
jsonwebtoken
模块用于创建和验证 JWT,express-jwt
模块则用于中间件实现,以实现我们的身份认证。
示例项目
我们将创建一个简单的电影信息 API,其中包括一些特定于用户的信息,例如他们是否有权访问该电影。在这个示例项目中,我们使用 MongoDB 存储电影信息,使用 Mongoose 建模器管理电影信息。
首先,安装必须的模块:
npm install express mongoose morgan --save npm install cors body-parser --save
然后创建一个 server.js
文件,并导入必要的依赖项:
const express = require('express'); const mongoose = require('mongoose'); const morgan = require('morgan'); const cors = require('cors'); const bodyParser = require('body-parser');
接下来,我们将连接 MongoDB 数据库:
const MONGODB_URI = 'mongodb://username:password@host:port/database'; mongoose.connect(MONGODB_URI, function(error) { if (error) { console.error(error); } else { console.log('Connected to MongoDB'); } });
紧接着,我们将创建一个 Movie
模型:
-- -------------------- ---- ------- ----- ----------- - ----------------- ------ - ----- ------- --------- ---- -- --------- - ----- ------- --------- ---- -- --------- - ----- ------- --------- ---- -- ------ - ----- ------- --------- ---- -- --------- - ----- -------- --------- ----- -------- ----- - --- ----- ----- - ----------------------- -------------
其中,每个电影都必须包括一个标题、一个导演、一个发布年份、一个类型和一个是否是公开的标志。
下一步,我们将使用常用的 Express.js 中间件:
const app = express(); app.use(morgan('tiny')); app.use(cors()); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json());
接下来,我们可以添加一些路由器来定义 API 终点:
-- -------------------- ---- ------- ----- ------ - ----------------- --------------- ------------- ---- - ----------------- -- --- ----- ------- --- --------------------- ------------- ---- - ----- ----- - ---------------------- -------------------------- ------- - -- ------- - --------------------- - ---- - ----------------- - --- --- ------------------------- ------------- ---- - ----------------------------- --------------- ------ - -- ------- - --------------------- - ---- - ---------------- - --- --- ---------------------- ------------- ---- - ----- ----- - --- ---------------- -------------------------- - -- ------- - --------------------- - ---- - ---------- -------- ------ ----- -------------- --- - --- --- ------------------------- ------------- ---- - -------------------------------------- --------- --------------- ------ - -- ------- - --------------------- - ---- - ---------- -------- ------ ------- -------------- --- - --- --- ---------------------------- ------------- ---- - -------------------------------------- --------------- - -- ------- - --------------------- - ---- - ---------- -------- ------ ------- -------------- --- - --- --- ------------ --------
这里我们定义了几个基本路由,使我们能够查找、创建、更新和删除电影。
创建 JWT 令牌
现在我们已经有了一个基本的 Express.js 应用程序。接下来,我们将向它添加 JWT 身份认证机制。我们需要使用两个函数来创建和验证 JWT:jsonwebtoken
模块的 sign()
和 verify()
方法。
首先,让我们编写一个函数来创建 JWT:
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ---------- - --------- -------- ----------------- - ----- ------- - - --------- ------------- -- ----- ------- - - ---------- ---- -- ----- ----- - ----------------- ----------- --------- ------ ------ -
在这个函数中,我们定义了一个 payload
对象,它包含一个 username
字段,用于将来检查用户身份。然后,我们定义了一个选项对象,它指定 JWT 语言中的到期日期。最后,我们使用此数据调用 jwt.sign()
方法,该方法使用了我们事先定义的 JWT_SECRET
。
解码 JWT
我们已经创建了一个函数来生成 JWT,接下来是如何在服务器端解码 JWT。您可以使用带有 express-jwt
模块的简单中间件来完成这项工作。
const expressJwt = require('express-jwt'); app.use(expressJwt({ secret: JWT_SECRET }).unless({ path: ['/'] }));
这个中间件将负责解析 JWT 并将其放置到 req.user
对象中。unless()
选项可以在不需要身份验证的特定路线上应用中间件。
使用 JWT 检查权限
最后,我们需要使用 JWT 来检查访问权限。我们将使用一个名为 requireAuth
的中间件函数来完成这个任务:
-- -------------------- ---- ------- -------- ---------------- ---- ----- - ----- ----- - -------------------------- -- ------- - ----------------- ----------- ------------- -------------- -- ----- - ------------------------------------- - ---- - -------- - ---------------------- ------- - --- - ---- - ------------------------------------- - -
这个函数检查 req.headers.authorization
是否包含 JWT,并使用 jwt.verify()
方法将其解码。如果身份验证成功,则将用户对象放置到 req.user
中,并将控制权转移给下一个中间件。
组合所有的中间件
最后,我们将所有中间件合并到一个文件中。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- -------- - -------------------- ----- ------ - ------------------ ----- ---- - ---------------- ----- ---------- - ----------------------- ----- --- - ------------------------ ----- ---------- - ----------------------- ----- ----------- - ------------------------------------------------- ----- ---------- - --------- ----------------------------- --------------- - -- ------- - --------------------- - ---- - ---------------------- -- ---------- - --- ----- --- - ---------- ------------------------ ---------------- ------------------------------- --------- ---- ---- --------------------------- ----- -------- - ------------ ------- ---------- ----------- ----- ----- --- -------- ----------------- - ----- ------- - - --------- ------------- -- ----- ------- - - ---------- ---- -- ----- ----- - ----------------- ----------- --------- ------ ------ - -------- ---------------- ---- ----- - ----- ----- - -------------------------- -- ------- - ----------------- ----------- ------------- -------------- -- ----- - ------------------------------------- - ---- - -------- - ---------------------- ------- - --- - ---- - ------------------------------------- - - ------------------ ------------- ---- - ----- ---- - - --------- ------------------ --------- ----------------- -- -- -------------- --- -------- - --------------------------- ---- ------- ------- - -- -------------- --- ----------- - --------------------------- ----------- ------- - ----- ----- - ------------------ ---------- ------ ----- --- --- ------------------ ---------------------------------- ----- ------ - ----------------- ----- ----------- - ----------------- ------ - ----- ------- --------- ---- -- --------- - ----- ------- --------- ---- -- --------- - ----- ------- --------- ---- -- ------ - ----- ------- --------- ---- -- --------- - ----- -------- --------- ----- -------- ----- - --- ----- ----- - ----------------------- ------------- --------------- ------------- ---- - ----------------- -- --- ----- ------- --- --------------------- ------------ ------------- ---- - ----- ----- - ----------------------------------------------------- -------------------------- ------- - -- ------- - --------------------- - ---- - ----------------- - --- --- ------------------------- ------------ ------------- ---- - ----------------------------- --------------- ------ - -- ------- - --------------------- - ---- - ---------------- - --- --- ---------------------- ------------ ------------- ---- - -- ---------------- -- ------------------ -- ------------------ -- ---------------- - ---------- -------- -------- -------- -------- --- ------- - ----- ----- - --- ---------------- -------------------------- - -- ------- - --------------------- - ---- - ---------- -------- ------ ----- -------------- --- - --- --- ------------------------- ------------ ------------- ---- - -------------------------------------- --------- --------------- ------ - -- ------- - --------------------- - ---- - ---------- -------- ------ ------- -------------- --- - --- --- ---------------------------- ------------ ------------- ---- - -------------------------------------- --------------- - -- ------- - --------------------- - ---- - ---------- -------- ------ ------- -------------- --- - --- --- ------------ -------- ---------------- ---------- - ------------------ --- ------- -- ---- -------- ---
总结
通过本文,您已经了解了如何使用 JWT 进行身份验证。我们已经看到了如何使用 jsonwebtoken
和 express-jwt
模块来生成和验证 JWT。我们在一个简单的电影信息 API 中使用了 JWT 来控制对受保护资源的访问。现在,您可以参考这篇文章来使用 JWT 保护您的 Web 应用程序,并确保您的用户是被授权的!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c0917183d39b48814dfb23