如何使用 Node.js 创建和验证 JWT?
在本文中,我们将了解如何在 Node.js 中创建和验证 JWT 令牌。
先决条件:
- 良好的 JavaScript 知识。
- 关于 ExpressJs 的基础知识。
- API认证基础知识。
- 关于邮递员及其用途的基本知识。
在 Web 开发中,我们还希望保护我们的路由,因此我们有 3 种类型的方法来保护我们的路由,它们是 cookie、会话或 API 身份验证。如果您希望 API 端点中的安全路由,cookie 和会话仅适用于浏览器。所以你必须需要API的认证机制。或者在目前,我们主要使用 API,因此必须创建安全的 API 端点。 API 身份验证中最流行的方式是使用 JsonWebToken,它与多种技术以及 NodeJ 一起工作。在本文中,我们在 ExpressJs 的帮助下创建了一些虚拟 API 端点,并在 JWT 令牌机制的帮助下确保它们的路由安全,并了解它们如何工作和验证令牌。 JsonWebtoken 的缩写是 JWT。
方法:在开始本文之前,我们将在这里讨论文章的问题细节,我们正在讨论保护 API 端点的最流行的方法。智威汤逊提供的。我们将首先设置 NodeJs 来编写我们的代码,然后我们将看到如何创建和验证 JWT 令牌,最后,我们将在 Postman API 测试工具的帮助下看到我们的 API 输出。
分步实施:
第一步:首先建立NodeJs项目。如果你没有NodeJs或NPM请参考这篇文章。使用 npm 启动 NodeJs 项目。
npm init -y
“-y”将所有问题答案标记为默认值。
启动 NodeJs 项目后,进入第二步。
步骤2:启动项目后安装一些依赖项。通过 npm 安装 express 和 jsonwebtoken
npm install express jsonwebtoken
第 3 步:将 nodemon 安装为开发依赖项。
npm install -d nodemon
项目结构:安装完成后,创建一个 index.js 文件,现在你的目录结构如下所示。
第 4 步:在 package.json 文件中再添加一个脚本。打开 package.json 文件并将下面的一行添加到测试脚本中。
步骤 5:在借助 JWT 创建和验证 API 端点之前,首先编写一些代码以供进一步使用。
文件名:index.js
Javascript
// Import express for creating API's endpoints
const express = require('express');
// Import jwt for API's endpoints authentication
const jwt = require('jsonwebtoken');
// Creates an Express application, initiate
// express top level function
const app = express();
// A port for serving API's
const port = 3000;
// A demo get route
app.get('/', (req, res) => {
res.json({
route: '/',
authentication: false
});
});
// Listen the server
app.listen(port, () => {
console.log(`Server is running : http://localhost:${port}/`);
});
Javascript
// A fake database object.
let databse = [
{
name: 'gfg',
work: 'knowledge provider',
password: 'abc'
},
{
name: 'suryapratap',
work: 'technical content writer',
password: '123'
}
];
Javascript
// Allow json data
app.use(express.json());
Javascript
// Login route.
app.post('/login', (req, res) => {
// Get the name to the json body data
const name = req.body.name;
// Get the password to the json body data
const password = req.body.password;
// Make two variable for further use
let isPresent = false;
let isPresnetIndex = null;
// Iterate a loop to the data items and
// check what data are method
for(let i=0; i
Javascript
jwt.sign(
{data_obeject},
"secret_key",
{Options}
)
Javascript
// Verify route
app.get('/auth', (req, res) => {
// Get token value to the json body
const token = req.body.token;
// If the token is present
if(token){
// Verify the token using jwt.verify method
const decode = jwt.verify(token, 'secret');
// Return response with decode data
res.json({
login: true,
data: decode
});
}else{
// Return response with error
res.json({
login: false,
data: 'error'
});
}
});
Javascript
jwt.verify(token_value, 'secret_key');
Javascript
// Import express for creating API's endpoints
const express = require("express");
// Import jwt for API's endpoints authentication
const jwt = require("jsonwebtoken");
// Creates an Express application, initiate
// express top level function
const app = express();
// A port for serving API's
const port = 3000;
// A fake database object
let databse = [
{
name: "gfg",
work: "knowledge provider",
password: "abc",
},
{
name: "suryapratap",
work: "technical content writer",
password: "123",
},
];
// A demo get route
app.get("/", (req, res) => {
res.json({
route: "/",
authentication: false,
});
});
// Allow json data
app.use(express.json());
// Login route
app.post("/login", (req, res) => {
// Get the name to the json body data
const name = req.body.name;
// Get the password to the json body data
const password = req.body.password;
// Make two variable for further use
let isPresent = false;
let isPresnetIndex = null;
// iterate a loop to the data items and
// check what data are matched.
for (let i = 0; i < databse.length; i++) {
// If data name are matched so check
// the password are correct or not
if (databse[i].name === name
&& databse[i].password === password) {
// If both are correct so make
// isPresent variable true
isPresent = true;
// And store the data index
isPresnetIndex = i;
// Break the loop after matching successfully
break;
}
}
// If isPresent is true, then create a
// token and pass to the response
if (isPresent) {
// The jwt.sign method are used
// to create token
const token = jwt.sign(databse[isPresnetIndex], "secret");
// Pass the data or token in response
res.json({
login: true,
token: token,
data: databse[isPresnetIndex],
});
} else {
// If isPresent is false return the error
res.json({
login: false,
error: "please check name and password.",
});
}
});
// Verify route
app.get("/auth", (req, res) => {
// Get token value to the json body
const token = req.body.token;
// If the token is present
if (token) {
// Verify the token using jwt.verify method
const decode = jwt.verify(token, "secret");
// Return response with decode data
res.json({
login: true,
data: decode,
});
} else {
// Return response with error
res.json({
login: false,
data: "error",
});
}
});
// Listen the server
app.listen(port, () => {
console.log(`Server is running :
http://localhost:${port}/`);
});
Step 6: dummy code准备好后,创建一个json数据库对象并存储一些dummy数据。
文件名:index.js
Javascript
// A fake database object.
let databse = [
{
name: 'gfg',
work: 'knowledge provider',
password: 'abc'
},
{
name: 'suryapratap',
work: 'technical content writer',
password: '123'
}
];
第 7 步:允许 JSON 数据与 API 进行通信。通过为正文解析器添加中间件来允许请求中的 JSON 数据。
文件名:index.js
Javascript
// Allow json data
app.use(express.json());
第 8 步:创建登录路由并创建 JWT 令牌。在这里,创建一个登录帖子路由并创建一个 JWT 令牌并将其返回到响应中。阅读代码注释以更好地理解。
文件名:index.js
Javascript
// Login route.
app.post('/login', (req, res) => {
// Get the name to the json body data
const name = req.body.name;
// Get the password to the json body data
const password = req.body.password;
// Make two variable for further use
let isPresent = false;
let isPresnetIndex = null;
// Iterate a loop to the data items and
// check what data are method
for(let i=0; i
步骤 9: JWT 签名方法用于创建令牌,其中包含三个参数,一个是响应对象,第二个是密钥,最后一个是选项对象,以便更好地使用令牌。
文件名:index.js
Javascript
jwt.sign(
{data_obeject},
"secret_key",
{Options}
)
如果您想了解有关 jwt.sign 方法的更多信息,请参阅官方文档。
第 10 步:现在我们将为认证 jwt 令牌创建另一条路由。在这里,我们创建一个身份验证路由并验证即将到来的 JWT 令牌。
文件名:index.js
Javascript
// Verify route
app.get('/auth', (req, res) => {
// Get token value to the json body
const token = req.body.token;
// If the token is present
if(token){
// Verify the token using jwt.verify method
const decode = jwt.verify(token, 'secret');
// Return response with decode data
res.json({
login: true,
data: decode
});
}else{
// Return response with error
res.json({
login: false,
data: 'error'
});
}
});
步骤 11: JWT 验证方法用于验证令牌,有两个参数,一个是令牌字符串值,第二个是密钥,用于匹配令牌是否有效。验证方法返回我们存储令牌的解码对象。
文件名:index.js
Javascript
jwt.verify(token_value, 'secret_key');
如果您想了解有关 jwt.verify 方法的更多信息,请参阅官方文档。
下面是上述分步实现的完整代码:
文件名:index.js
Javascript
// Import express for creating API's endpoints
const express = require("express");
// Import jwt for API's endpoints authentication
const jwt = require("jsonwebtoken");
// Creates an Express application, initiate
// express top level function
const app = express();
// A port for serving API's
const port = 3000;
// A fake database object
let databse = [
{
name: "gfg",
work: "knowledge provider",
password: "abc",
},
{
name: "suryapratap",
work: "technical content writer",
password: "123",
},
];
// A demo get route
app.get("/", (req, res) => {
res.json({
route: "/",
authentication: false,
});
});
// Allow json data
app.use(express.json());
// Login route
app.post("/login", (req, res) => {
// Get the name to the json body data
const name = req.body.name;
// Get the password to the json body data
const password = req.body.password;
// Make two variable for further use
let isPresent = false;
let isPresnetIndex = null;
// iterate a loop to the data items and
// check what data are matched.
for (let i = 0; i < databse.length; i++) {
// If data name are matched so check
// the password are correct or not
if (databse[i].name === name
&& databse[i].password === password) {
// If both are correct so make
// isPresent variable true
isPresent = true;
// And store the data index
isPresnetIndex = i;
// Break the loop after matching successfully
break;
}
}
// If isPresent is true, then create a
// token and pass to the response
if (isPresent) {
// The jwt.sign method are used
// to create token
const token = jwt.sign(databse[isPresnetIndex], "secret");
// Pass the data or token in response
res.json({
login: true,
token: token,
data: databse[isPresnetIndex],
});
} else {
// If isPresent is false return the error
res.json({
login: false,
error: "please check name and password.",
});
}
});
// Verify route
app.get("/auth", (req, res) => {
// Get token value to the json body
const token = req.body.token;
// If the token is present
if (token) {
// Verify the token using jwt.verify method
const decode = jwt.verify(token, "secret");
// Return response with decode data
res.json({
login: true,
data: decode,
});
} else {
// Return response with error
res.json({
login: false,
data: "error",
});
}
});
// Listen the server
app.listen(port, () => {
console.log(`Server is running :
http://localhost:${port}/`);
});
测试路由的步骤:我们将使用 Postman 测试 API 路由。首先测试登录路径。打开邮递员并使用适当的 JSON 数据在'/login'路由上发出 post 请求。
使用 localhost 地址并在 /login 路由中发出 post 请求,并以 json 格式发送适当的数据,最后,您将获得包含登录状态和对象的令牌或数据的 JSON 响应。使用令牌对 API 端点进行身份验证,然后再次使用 localhost 地址并在“/auth”路由中发出获取请求并发送适当的数据令牌。
验证后,您将在令牌中获得正确的数据对象存储。