成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Node登陸認證實戰!十分鐘手把手教會你!

開發 前端
在企業級開發中,Token 認證機制已成為保護 API 安全的行業標準。本文將演示如何通過 Node.js 生成 JSON Web Token (JWT),并結合 Redis 緩存實現完整的認證流程。

圖片圖片

零.前言 

在企業級開發中,Token 認證機制已成為保護 API 安全的行業標準。

本文將演示如何通過 Node.js 生成 JSON Web Token (JWT),并結合 Redis 緩存實現完整的認證流程。

一.安裝工具庫 

  • express:Express 的作用相當于 node.js 的內置模塊 http,是專門用來創建web服務器的。用來接收前端的請求。
  • jsonwebtoken:生成、校驗 token 的工具。
  • ioredis:緩存數據的工具,對 redis 插件進行封裝,集成 promise 等工具。
  • dotenv:用來管理本地環境變量。
  • mysql2:操作數據庫
  • sequelize:封裝數據庫操作,通過內置 api 而不是sql語句操作數據庫。
npm install express jsonwebtoken ioredis dotenv mysql2  sequelize

二.配置環境 

在項目根目錄新建 .env 文件

圖片圖片

在 app.js 中配置 dotenv

圖片圖片

require('dotenv').config();

然后我們就可以在項目中自定義的文件中獲取 .env 文件中配置的數據了,例如:

process.env.REDIS_PORT

三.配置 Redis 

圖片圖片

Redis 是一個高性能的鍵值存儲數據庫,常用于緩存、消息隊列、會話存儲等場景。

在 Node.js 中使用 Redis 可以顯著提升應用性能,尤其是在頻繁讀取數據的場景下。

如果你是前端小白,這里你就把 Redis 當成一個很牛逼的數據庫,可以存各式各樣的數據,可以給存儲的數據設置過期時間,時間一到就自動刪除了。

Redis 和 MySQL 數據庫一樣,分為服務端和客戶端。服務端用來存儲數據,客戶端用來對數據進行讀寫操作。

所以我們要先安裝服務端,再安裝客戶端。

安裝 Redis 服務端的文章大家可以自行搜索,或者去問 DeepSeek、豆包等大模型,這里不再贅述。

圖片圖片

而本文我們安裝的 ioredis 是一個 Node.js 環境下的 Redis 客戶端庫。我們可以通過它內置的 API 操作 Redis 數據庫中的數據。

3.1 配置 Redis

新建 config 文件夾,然后新建 redis.js 文件:

圖片圖片

將創建好的 Redis 配置文件加載到 app.js 中

圖片

四.jwt 生成 token 

古代調兵遣將需要兵符,這個兵符就是個憑證,憑證為真,兵部才允許你把兵調走。

同樣在系統開發中,只有是這個系統的用戶才被允許訪問一些資源。

1.前端用戶登陸成功之后,后臺通過一個工具將一段字符串返回給前端用戶。

2.前端用戶每次訪問其他頁面(資源)的時候請求頭都攜帶這個字符串。

3.后端拿到這個字符串之后再用工具去校驗,校驗通過,就允許訪問其他資源。

所以我們說的字符串就是 token,只不過這個字符串比較復雜。

而JWT是一種具體的 Token 實現方式,是一種認證解決方案。

你可以把 token 看做是 JWT。

而項目中我們安裝的 jsonwebtoken 是一個生成 token 字符串、校驗 token 的工具。比如它的生成 token 的方法:

jwt.sign(
    user,// Payload
    JWT_SECRET, // 秘鑰   
    { expiresIn: 3600000 } // 令牌過期時間(1小時)  
  );

所以 JWT 由三部分組成,用點號(.)分隔:

  • Header(頭部):包含令牌的類型和簽名算法。
  • Payload(載荷):包含聲明(Claims),即關于用戶或其他實體的信息。
  • Signature(簽名):用于驗證令牌的完整性和真實性。 一個典型的 JWT 看起來像這樣:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaGFuIEdvZGxleSIsImlhdCI6MTUxNjIzOTAzMCwiZXhwIjoxNTE2MjM5MDkwfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

也就是使用 jsonwebtoken 庫的 sign 方法就能生成一個 token 字符串。

前面說了一堆廢話,接下來配置 jwt 工具:在 utils 文件夾在新建 jwt.js 文件

圖片圖片

在 app.js 文件中加載 jwt。

圖片圖片

注:jsonwebtoken 設置 token 過期時間有兩種方式:

1.數值,1h=60*60*1000=3600000

const token = jwt.sign(
    { id: user.id, },// Payload
    process.env.JWT_SECRET, // 秘鑰   
    { expiresIn: 3600000 }
  );

2.字符串: 1h表示1小時,2m表示2分鐘,24d表示24天

const token = jwt.sign(
    { id: user.id, },// Payload
    process.env.JWT_SECRET, // 秘鑰   
   { expiresIn: "1h" }
  );

五.改造用戶登陸接口 

核心流程:

1.獲取請求參數:username 和 password

2.使用 sequelize 的 findOne 方法查詢用戶信息。注:sequelize 工具的使用在前面幾篇文章講的有,這里不再贅述。

3.如果用戶不存在,返回錯誤信息。

4.用戶存在,密碼不對,返回錯誤信息

5.生成 token 信息

6.將token信息存儲到 redis,設置過期時間

7.將token返回給前端

// 用戶登陸
router.post('/login', async (req, res) => {
  try {
    const { username, password } = req.body;
    // 根據用戶名查詢用戶信息
    constuser = awaitUser.findOne({
      where: {
        username: username,
      }
    });
    // 用戶存在
    if (user) {
      // 校驗密碼
      if (password != user.password) {
        throw new CustomError("密碼錯誤!");
      }
      // 生成token
      consttoken = generateToken(user);
      // 將token存儲到Redis
      awaitredisClient.set(`token:${user.id}`, token, 'EX', 3600); // 1小時過期
      // 將token返回
      constresult = { token: token };
      success(res, "登錄成功", result);
    } else {
      throw new CustomError("用戶不存在!");
    }
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

注:redis 存儲數據的方法:

  • 參數1:key
  • 參數2:value
  • 參數3:固定,表示設置過期時間
  • 參數4:過期時間具體值,3600表示 1 小時,和jwt不一樣。
redisClient.set(key, value, 'EX', 過期時間)

測試結果:

密碼錯誤;

圖片圖片

登陸成功,返回 token 信息。

圖片

六.Token 身份校驗 

在 utils 文件夾下新建 auth.js 文件:

圖片圖片

核心流程:

1.從請求頭中獲取 token 信息,如果 token 不存在,就返回錯誤信息

2.使用 jsonwebtoken 庫的 verify 方法校驗 token 信息,校驗失敗返回錯誤信息

3.從Redis緩存中獲取 token 信息,如果 token 不存在,就返回錯誤信息

4.校驗成功,才能訪問其他資源

圖片圖片

然后在需要進行安全校驗的接口上面添加這個方法:

圖片圖片

測試:

1.header 為空

圖片圖片

2.token校驗失敗

圖片圖片

3.token校驗成功

圖片圖片

七.完整代碼 

通過網盤分享的文件:zhifou-mall-node-api.zip
鏈接: https://pan.baidu.com/s/10zOgKQiNfBIrppfAUk6lpw?pwd=6666 
提取碼: 6666

拿到代碼之后記得:

  • npm install 安裝依賴
  • 修改 Sequelize.js 里面連接 MySQL 數據庫的賬號密碼等配置項
  • 修改 .env 文件 redis 的配置信息
  • npm app.js 啟動后端項目
責任編輯:武曉燕 來源: 知否技術
相關推薦

2022-03-04 16:06:33

數據庫HarmonyOS鴻蒙

2023-07-15 18:26:51

LinuxABI

2019-04-01 14:59:56

負載均衡服務器網絡

2020-12-17 06:48:21

SQLkafkaMySQL

2023-03-13 07:52:13

2022-03-21 08:05:38

HTTP/1.1QUIC協議

2025-02-14 01:00:00

deepseek4jAPIJSON

2015-09-06 09:22:24

框架搭建快速高效app

2012-07-10 01:22:32

PythonPython教程

2024-05-13 09:28:43

Flink SQL大數據

2023-11-30 10:21:48

虛擬列表虛擬列表工具庫

2022-06-16 07:31:41

Web組件封裝HTML 標簽

2024-06-19 09:58:29

2021-09-07 09:40:20

Spark大數據引擎

2023-04-12 11:18:51

甘特圖前端

2023-11-09 14:44:27

Docker鏡像容器

2020-12-11 09:40:10

DevOpsCICD

2015-11-06 11:03:36

2022-04-13 22:01:44

錯誤監控系統

2023-12-08 13:19:00

前端Reactour流行庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久中文字 | 国产成人在线观看免费 | 欧美在线观看一区二区 | 欧美日韩中文在线 | 亚洲欧美日韩精品久久亚洲区 | 日韩精品中文字幕一区二区三区 | 美女啪啪国产 | 久久久天堂 | 在线观看免费av片 | 久久男人| 国产乱码精品一区二区三区忘忧草 | 成人小视频在线观看 | 伊人激情综合网 | 国产在线精品一区二区三区 | 欧美一级二级三级视频 | 伊人伊人 | 中国一级毛片免费 | 欧美一区二区 | 日韩免费看片 | 亚洲精品成人 | 中文字幕亚洲一区二区va在线 | 中文字幕不卡在线观看 | 天天插天天狠天天透 | 国产亚洲精品久久久优势 | 激情久久av一区av二区av三区 | 国产特级毛片aaaaaa喷潮 | 一区二区久久 | 99久久精品免费看国产四区 | 一区二区三区四区在线播放 | 国产一区二区三区亚洲 | 狠狠干综合视频 | 精品av天堂毛片久久久借种 | 欧美国产日韩精品 | 成人激情视频免费在线观看 | 91久久夜色 | 狠狠操狠狠 | 欧美一区二区三区免费电影 | 亚洲日本中文 | 亚洲成人精品在线 | av在线播放国产 | 欧美一区二 |