最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js中JWT實(shí)現(xiàn)身份驗(yàn)證的詳細(xì)步驟

 更新時(shí)間:2024年12月26日 09:55:46   作者:關(guān)山月  
身份驗(yàn)證是Web開發(fā)的重要組成部分,JWT由于其簡單性,安全性和可擴(kuò)展性,已成為在Web應(yīng)用程序中實(shí)現(xiàn)身份驗(yàn)證的流行方法,在這篇文章中,我將指導(dǎo)你在Node.js應(yīng)用程序中使用MongoDB進(jìn)行數(shù)據(jù)存儲(chǔ)來實(shí)現(xiàn)JWT身份驗(yàn)證,需要的朋友可以參考下

在開始之前,我假設(shè)你已經(jīng)在你的機(jī)器上安裝了Node.js、MongoDB和VS Code,并且你知道如何創(chuàng)建MongoDB數(shù)據(jù)庫和基本的RESTful API。

讓我們開始吧!

什么是JWT認(rèn)證?

JWT身份驗(yàn)證依賴JSON Web令牌來確認(rèn)Web應(yīng)用中用戶的身份。JSON Web令牌是使用密鑰進(jìn)行數(shù)字簽名。

簡而言之,JWT身份為網(wǎng)站提供一個(gè)密碼。一旦你登錄,你就得到了這個(gè)密碼。

JSON Web Token由三個(gè)部分組成,由點(diǎn).分開:

  • Header
  • Payload
  • Signature

下面是JWT的基本結(jié)構(gòu):

xxxx.yyyy.zzzz 
  • Header: 這部分包含有關(guān)令牌的信息,如其類型和如何保護(hù)。
  • Payload: 這部分包含關(guān)于用戶的聲明,如用戶名或角色。
  • Signature: 確保令牌的完整性,并驗(yàn)證它沒有被更改,這可以確保代碼安全。

現(xiàn)在,讓我們看看在node.js項(xiàng)目中進(jìn)行JWT身份驗(yàn)證的步驟。

步驟1:設(shè)置項(xiàng)目

首先,創(chuàng)建一個(gè)新目錄:

mkdir nodejs-jwt-auth
cd nodejs-jwt-auth

在終端中運(yùn)行以下命令初始化項(xiàng)目:

npm init -y

接下來,通過以下命令安裝必要的依賴項(xiàng):

npm install express mongoose jsonwebtoken dotenv

上面的命令將安裝:

  • express:用于構(gòu)建Web服務(wù)器。
  • mongoose:MongoDB的ODM(對象數(shù)據(jù)建模)庫。
  • jsonwebtoken:生成和驗(yàn)證JSON Web令牌(JWT)以進(jìn)行身份驗(yàn)證。
  • dotenv:從.env文件加載環(huán)境變量。

此時(shí),您的package.json文件應(yīng)該如下所示:

步驟2:獲取MongoDB連接字符串

要獲取MongoDB連接字符串,請查看以下鏈接。

9 Steps to Build a RESTful API with Node.js, MongoDB, and Express

步驟3:創(chuàng)建.env文件

為了保護(hù)MongoDB連接信息,讓我們在根目錄中創(chuàng)建一個(gè)名為.env的新文件。

將以下代碼添加到.env文件中。

MONGODB_URL=<Your MongoDB Connection String>
SECRET_KEY="your_secret_key_here"

將 <Your MongoDB Connection String> 替換為您從MongoDB Atlas獲得的連接字符串。

MONGODB_URL='mongodb+srv://shefali:********@cluster0.sscvg.mongodb.net/nodejs-jwt-auth'
SECRET_KEY="ThisIsMySecretKey"

最后,在MONGODB_URL中,我添加了nodejs-jwt-auth,這是我們的數(shù)據(jù)庫名稱。

步驟4:設(shè)置Express應(yīng)用程序

在根目錄下創(chuàng)建一個(gè)名為index.js的文件,并將以下代碼添加到該文件中。

const express = require("express");
const mongoose = require("mongoose");

require("dotenv").config(); //for using variables from .env file.

const app = express();
const port = 3000;

//middleware provided by Express to parse incoming JSON requests.
app.use(express.json()); 

mongoose.connect(process.env.MONGODB_URL).then(() => {
  console.log("MongoDB is connected!");
});

app.get("/", (req, res) => {
  res.send("Hello World!");
});

app.listen(port, () => {
  console.log(`Server is listening on port ${port}`);
});

現(xiàn)在,讓我們通過以下命令運(yùn)行服務(wù)器。

node index.js

輸出如下圖所示:

通過使用命令node index.js,必須在每次更改文件時(shí)重新啟動(dòng)服務(wù)器。為了避免這種情況,您可以使用以下命令安裝nodemon。

npm install -g nodemon

現(xiàn)在使用下面的命令運(yùn)行服務(wù)器,它會(huì)在每次更改文件時(shí)重新啟動(dòng)服務(wù)器。

nodemon index.js

步驟5:創(chuàng)建用戶模型

在根目錄下創(chuàng)建一個(gè)名為“models”的新目錄,并在其中創(chuàng)建一個(gè)名為“User.js”的新文件。

將以下代碼添加到User.js文件中:

const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
  username: {
    type: String,
    required: true,
    unique: true,
  },
  password: {
    type: String,
    required: true,
  },
});

module.exports = mongoose.model("User", userSchema);

步驟6:實(shí)現(xiàn)身份驗(yàn)證路由

在根目錄中,創(chuàng)建一個(gè)名為“routes”的新目錄,并在其中創(chuàng)建一個(gè)名為“auth.js”的文件。

現(xiàn)在,將以下代碼添加到該文件中:

const express = require("express");
const jwt = require("jsonwebtoken");
const User = require("../models/User");
const router = express.Router();

// Signup route
router.post("/signup", async (req, res) => {
  try {
    const { username, password } = req.body;
    const user = new User({ username, password });
    await user.save();
    res.status(201).json({ message: "New user registered successfully" });
  } catch (error) {
    res.status(500).json({ message: "Internal server error" });
  }
});

// Login route
router.post("/login", async (req, res) => {
  const { username, password } = req.body;
  try {
    const user = await User.findOne({ username });

    if (!user) {
      return res.status(401).json({ message: "Invalid username or password" });
    }
    if (user.password !== password) {
      return res.status(401).json({ message: 'Invalid username or password' });
    }
    // Generate JWT token
    const token = jwt.sign(
      { id: user._id, username: user.username },
      process.env.SECRET_KEY
    );
    res.json({ token });
  } catch (error) {
    res.status(500).json({ message: "Internal server error" });
  }
});

module.exports = router;

步驟7:使用中間件保護(hù)路由

在根目錄中,創(chuàng)建一個(gè)名為middleware.js的新文件,并將以下代碼添加到該文件中。

const jwt = require("jsonwebtoken");

function verifyJWT(req, res, next) {
  const token = req.headers["authorization"];

  if (!token) {
    return res.status(401).json({ message: "Access denied" });
  }

  jwt.verify(token, process.env.SECRET_KEY, (err, data) => {
    if (err) {
      return res.status(401).json({ message: "Failed to authenticate token" });
    }
    req.user = data;
    next();
  });
}

module.exports = verifyJWT;

代碼是一個(gè)中間件函數(shù),用于在應(yīng)用程序中驗(yàn)證JSON Web令牌(JWT)。

步驟8:解碼細(xì)節(jié)

現(xiàn)在要解碼詳細(xì)信息,請修改index.js,如下所示:

const express = require('express');
const authRouter = require('./routes/auth');
const mongoose = require("mongoose");
const verifyJWT = require("./middleware")

require("dotenv").config(); //for using variables from .env file.

const app = express();
const PORT = 3000;

mongoose.connect(process.env.MONGODB_URL).then(() => {
    console.log("MongoDB is connected!");
});
app.use(express.json());

//Authentication route
app.use('/auth', authRouter);

//decodeDetails Route
app.get('/decodeDetails', verifyJWT, (req, res) => {
  const { username } = req.user;
  res.json({ username });
});

app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

/auth路由由authRouter處理,用于用戶身份驗(yàn)證。

app.get('/decodeDetails', verifyJWT, (req, res) => {
  const { username } = req.user;
  res.json({ username });
});

當(dāng)向/decodeDetails發(fā)出請求時(shí),verifyJWT中間件驗(yàn)證JWT令牌。

步驟9:測試API

為了測試API,使用了名為Thunder Client的VS Code擴(kuò)展。

注冊

http://localhost:3000/auth/signup 發(fā)送一個(gè)POST請求,其中包含Headers Content-Type : application/json 和以下JSON主體:

{
    "username": "shefali",
    "password": "12345678"
}

在響應(yīng)中,您將看到消息“新用戶注冊成功”。

登錄

http://localhost:3000/auth/login 發(fā)送一個(gè)POST請求,其中包含Header Content-Type : application/json 和JSON主體,以及您在注冊路由中創(chuàng)建的用戶名和密碼。

{
    "username": "shefali",
    "password": "12345678"
}

在響應(yīng)中,您將收到一個(gè)令牌。記下這個(gè)令牌,因?yàn)樵跍y試decodeDetails路由時(shí)需要它。

decodeDetails

http://localhost:3000/decodeDetails 發(fā)送一個(gè)GET請求,并帶有令牌值的Authorization頭。

在響應(yīng)中,您將獲得用戶名。

您已經(jīng)在Node.js應(yīng)用程序中成功實(shí)現(xiàn)了JWT身份驗(yàn)證。這種方法提供了一種安全有效的方式,來驗(yàn)證Web應(yīng)用程序中的用戶。

以上就是Node.js中JWT實(shí)現(xiàn)身份驗(yàn)證的詳細(xì)步驟的詳細(xì)內(nèi)容,更多關(guān)于Node.js JWT身份驗(yàn)證的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • HTTP JSON接口模擬工具Interfake快速入門教程

    HTTP JSON接口模擬工具Interfake快速入門教程

    這篇文章主要為大家介紹了HTTP JSON接口模擬工具Interfake快速入門教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Node.js的包詳細(xì)介紹

    Node.js的包詳細(xì)介紹

    這篇文章主要介紹了Node.js的包詳細(xì)介紹,Node.js的包是一個(gè)目錄,其中包含JSON格式的包說明文件package.json,Node.js的包基本遵循CommonJS規(guī)范,需要的朋友可以參考下
    2015-01-01
  • Node 模塊原理與用法詳解

    Node 模塊原理與用法詳解

    這篇文章主要介紹了Node 模塊原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了node.js模塊基本概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • k8s node節(jié)點(diǎn)重新加入master集群的實(shí)現(xiàn)

    k8s node節(jié)點(diǎn)重新加入master集群的實(shí)現(xiàn)

    這篇文章主要介紹了k8s node節(jié)點(diǎn)重新加入master集群的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • PHPStorm中如何對nodejs項(xiàng)目進(jìn)行單元測試詳解

    PHPStorm中如何對nodejs項(xiàng)目進(jìn)行單元測試詳解

    這篇文章主要給大家介紹了關(guān)于PHPStorm中如何對nodejs項(xiàng)目進(jìn)行單元測試的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • 為什么Node.js會(huì)這么火呢?Node.js流行的原因

    為什么Node.js會(huì)這么火呢?Node.js流行的原因

    是什么原因讓Node.js突然間如此流行呢?聽起來像是有了一種新的Web開發(fā)技術(shù),是這樣嗎?我們來匯總一下。
    2014-12-12
  • 在NPM發(fā)布自己造的輪子的方法步驟

    在NPM發(fā)布自己造的輪子的方法步驟

    這篇文章主要介紹了在NPM發(fā)布自己造的輪子的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • 詳解Koa中更方便簡單發(fā)送響應(yīng)的方式

    詳解Koa中更方便簡單發(fā)送響應(yīng)的方式

    這篇文章主要介紹了詳解Koa中更方便簡單發(fā)送響應(yīng)的方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • Node.js包管理器npm的具體使用

    Node.js包管理器npm的具體使用

    Node.js安裝包中都帶有一個(gè)重要的工具 包管理器npm,本文主要介紹了Node.js包管理器npm的具體使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Node多進(jìn)程的實(shí)現(xiàn)方法

    Node多進(jìn)程的實(shí)現(xiàn)方法

    我們都知道?Node.js?是以單線程的模式運(yùn)行的,但它使用的是事件驅(qū)動(dòng)來處理并發(fā),這樣有助于我們在多核?cpu?的系統(tǒng)上創(chuàng)建多個(gè)子進(jìn)程,從而提高性能
    2022-08-08

最新評(píng)論

白银市| 彝良县| 兴业县| 白朗县| 新竹市| 咸宁市| 牟定县| 陆良县| 东明县| 临沂市| 安龙县| 弥勒县| 那坡县| 大安市| 麻城市| 故城县| 灵璧县| 易门县| 新安县| 漳浦县| 兰西县| 武夷山市| 余姚市| 赤峰市| 余庆县| 怀仁县| 高台县| 阿克| 朝阳市| 长寿区| 静宁县| 肇东市| 全南县| 安多县| 正蓝旗| 曲沃县| 株洲县| 绥宁县| 荆州市| 凯里市| 婺源县|