国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

在Nodejs中使用JWT進(jìn)行鑒權(quán)

這篇具有很好參考價(jià)值的文章主要介紹了在Nodejs中使用JWT進(jìn)行鑒權(quán)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

什么是 JSON Web Token(JWT)?

JSON Web Token(JWT)是一種用于在web上傳遞信息的標(biāo)準(zhǔn),它以JSON格式表示信息,通常用于身份驗(yàn)證和授權(quán)。

JWT由三個(gè)部分組成:Header(頭部)、Payload(負(fù)載)和Signature(簽名)。它們用點(diǎn)號(hào)分隔開(kāi),形成了一個(gè)JWT令牌。

JWT 的基本結(jié)構(gòu)

  • Header

Header(頭部)是JWT結(jié)構(gòu)的第一部分,它是一個(gè)包含關(guān)于令牌的元數(shù)據(jù)的JSON對(duì)象。Header通常包含兩個(gè)主要字段:algtyp。

alg(Algorithm)字段:這個(gè)字段指定了用于簽名JWT的加密算法。它可以是以下之一:

  • HS256:HMAC-SHA256,使用密鑰進(jìn)行對(duì)稱加密。
  • RS256:RSA-SHA256,使用RSA密鑰對(duì)進(jìn)行非對(duì)稱加密。
  • ES256:ECDSA-SHA256,使用橢圓曲線數(shù)字簽名算法進(jìn)行非對(duì)稱加密,等等。

typ(Type)字段:這個(gè)字段表示令牌的類型。對(duì)于JWT,這個(gè)字段的值通常是**JWT**,用于指示這是一個(gè)JSON Web Token。

一個(gè)簡(jiǎn)單的 JWT 頭可以是下面這樣:

{
    "typ":"JWT",
    "alg":"HS256"
 }
  • Payload

Payload(負(fù)載)用于存儲(chǔ)實(shí)際的用戶數(shù)據(jù)和其他相關(guān)信息。Payload是一個(gè)包含鍵值對(duì)的JSON對(duì)象,它包含了有關(guān)JWT令牌的有用信息。

JWT 規(guī)定了7個(gè)官方字段:

- iss (issuer):簽發(fā)人
- exp (expiration time):過(guò)期時(shí)間
- sub (subject):主題
- aud (audience):受眾
- nbf (Not Before):生效時(shí)間
- iat (Issued At):簽發(fā)時(shí)間
- jti (JWT ID):編號(hào)

除了官方字段,你還可以在這個(gè)部分定義私有字段,一個(gè)Payload如下所示:

 {
  "userId":"123",
  "iss": "your_app",
  "sub": "user123",
  "role": "admin",
  "exp": 1699999999
 }
  • Signature

JWT的Signature(簽名)是JWT令牌的第三個(gè)部分,用于確保令牌的完整性和來(lái)源驗(yàn)證。Signature是通過(guò)將Header和Payload的組合(不包括分隔符**.**)與一個(gè)密鑰進(jìn)行加密或哈希生成的值。

Signature生成方式:

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

一個(gè)JWT示例

Header:
{
  "alg" : "HS256",

  "typ" : "JWT"
}

Payload:
{
  "id" : 123,

  "name" : "test"
}

Secret: your_secret

Header(經(jīng)過(guò)Base64編碼):

eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9

Payload(經(jīng)過(guò)Base64編碼):

eyJpZCI6IDEyMywgIm5hbWUiOiAidGVzdCJ9

使用提供的Secret對(duì)原始的Header和原始的Payload進(jìn)行加密生成Signature:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  "your_secret"
)

完整的的token需要吧這三部分拼起來(lái)如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTIzLCJuYW1lIjoidGVzdCJ9.oMyOEgY
iZosc0HYCkIjrqh_DH3CLlmIkIjOe-icpTg8

在Nodejs中使用JWT

1,環(huán)境配置

我們先來(lái)配置一下環(huán)境,首先初始化一個(gè)package.json文件存放我們用到的npm包:

npm init -y

然后安裝jsonwebtoken和express:
npm install express jsonwebtoken

2,創(chuàng)建一個(gè)基礎(chǔ)的服務(wù)器

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

app.use(express.json());

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

這里我們使用了**express.json**這個(gè)中間件,express.json() 是一個(gè) Express 中間件函數(shù),用于解析傳入請(qǐng)求體中的 JSON 數(shù)據(jù)。當(dāng)客戶端向服務(wù)器發(fā)送帶有 JSON 數(shù)據(jù)的 POST 請(qǐng)求時(shí),express.json() 中間件將從請(qǐng)求體中解析出 JSON 數(shù)據(jù),并將其添加到到 req.body 上。

3,在登錄之后下發(fā)token

// 用戶數(shù)據(jù)
const users = [
    { id: 1, username: "user1", password: "password1" },
    { id: 2, username: "user2", password: "password2" }
];
const jwtSecretKey = "your_jwt_secret_key";

// 登錄之后生成 JWT token
app.post("/user/login", async (req, res) => {
    try {
        const { username, password } = req.body;
        const user = users.find(u => u.username === username && u.password === password);

        if (!user) {
            return res.status(401).json({ error: "用戶名或密碼錯(cuò)誤" });
        }

        const payload = {
            userId: user.id,
        };
        //生成token 設(shè)置過(guò)期時(shí)間為 1 小時(shí)
        const token = await jwt.sign(payload, jwtSecretKey, { expiresIn: '1h' });
        res.json({ token });
    } catch (error) {
        res.status(500).json({ error: "登錄失敗" });
    }
});

為了演示,我們的用戶數(shù)據(jù)是寫死的

/user/login路由會(huì)在用戶名和密碼通過(guò)校驗(yàn)之后,使用jwt.sign生成一個(gè)token,并且設(shè)置過(guò)期時(shí)間為一個(gè)小時(shí)

jwt.sign 函數(shù)用于創(chuàng)建一個(gè) JWT 令牌,它接受一個(gè)payload,并使用給定的密鑰將其簽名生成一個(gè)令牌字符串。

以下是 jwt.sign 的基本用法以及其參數(shù):

jwt.sign(payload, secretOrPrivateKey, [options, callback])
  • payload:要存儲(chǔ)在token中的數(shù)據(jù),通常是一個(gè) JavaScript 對(duì)象,可以包含任意信息。
  • secretOrPrivateKey:用于對(duì)令牌進(jìn)行簽名的密鑰。
  • options(可選):一個(gè)包含選項(xiàng)的對(duì)象,用于配置生成的 JWT。常見(jiàn)的選項(xiàng)包括 expiresIn(過(guò)期時(shí)間)和 algorithm(簽名算法)等。
  • callback(可選):一個(gè)回調(diào)函數(shù),用于異步生成 JWT。

然后使用curl請(qǐng)求該路由,響應(yīng)內(nèi)容如下:
在Nodejs中使用JWT進(jìn)行鑒權(quán),JavaScript,node.js,前端,鑒權(quán)

4,創(chuàng)建isLogin中間件

async function isLogin(req, res, next) {
    const tokenHeaderKey = 'Authorization';
    const token = req.header(tokenHeaderKey)

    if (!token) {
        return res.status(401).json({ error: "用戶未登錄" });
    }

    const verified = await jwt.verify(token, jwtSecretKey);
    if (verified) {
        next()
    } else {
        return res.status(401).json({ error: "無(wú)效的token" });
    }
}

isLogin 是一個(gè)用于驗(yàn)證用戶是否已登錄的中間件。它首先從請(qǐng)求頭中獲取 Authorization 字段的值,該值應(yīng)該是 JWT 令牌。然后使用 jwt.verify 函數(shù)驗(yàn)證令牌的有效性。如果驗(yàn)證通過(guò),將調(diào)用 next(),表示用戶已登錄,然后繼續(xù)執(zhí)行后續(xù)的路由處理程序。如果驗(yàn)證失敗,返回 401 狀態(tài)碼,表示令牌無(wú)效。

5,創(chuàng)建需要身份驗(yàn)證的路由

// 獲取用戶信息
app.get("/user/:username", isLogin, async (req, res) => {
    const username = req.params.username;
    const user = users.find(u => u.username === username).map(u => ({ id: u.id, username: u.username}));
    res.json(user);
});

**/user/:username**是一個(gè)用于獲取用戶信息的路由。路由中的 :username 表示參數(shù),表示用戶的用戶名。

我們?cè)谶@個(gè)路由中添加了兩個(gè)中間件,首先通過(guò) isLogin 中間件驗(yàn)證用戶是否已登錄。如果用戶已登錄,才會(huì)進(jìn)入到下一個(gè)中間件,然后根據(jù)用戶名從 users 數(shù)組中查找用戶信息并作為響應(yīng)。

然后使用curl請(qǐng)求該路由,就能拿到用戶信息:

在Nodejs中使用JWT進(jìn)行鑒權(quán),JavaScript,node.js,前端,鑒權(quán)

6,使用axios攜帶token請(qǐng)求用戶信息

import axios from "axios";
const token = localStorage.getItem("token");
const url = "http://localhost:3000/user/your_username"
const headers = {
    "Authorization": token,
    "Content-Type": "application/json",
    "Accept": "application/json",
};
const getUserInfo = () => {
    axios.get(url, { headers: headers })
        .then((response) => {
            console.log(response);
        })
        .catch((error) => {
            console.log(error);
        });
}

在前端我們一般會(huì)使用axios來(lái)發(fā)起請(qǐng)求,只要把token的值放在http header中的Authorization字段即可。當(dāng)然除了放在Authorization之外,也可以放在其他header字段中,不過(guò)后端也需要從對(duì)應(yīng)的header字段取token。

完整代碼:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

app.use(express.json());

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

// 用戶數(shù)據(jù)
const users = [
    { id: 1, username: "user1", password: "password1" },
    { id: 2, username: "user2", password: "password2" }
];
const jwtSecretKey = "your_jwt_secret_key";

// 登錄之后生成 JWT token
app.post("/user/login", async (req, res) => {
    try {
        const { username, password } = req.body;
        
        const user = users.find(u => u.username === username && u.password === password);

        if (!user) {
            return res.status(401).json({ error: "用戶名或密碼錯(cuò)誤" });
        }

        const payload = {
            userId: user.id,
        };
        //生成token 設(shè)置過(guò)期時(shí)間為 1 小時(shí)
        const token = await jwt.sign(payload, jwtSecretKey, { expiresIn: '1h' });
        res.json({ token });
    } catch (error) {
        res.status(500).json({ error: "登錄失敗" });
    }
});

async function isLogin(req, res, next) {
    const tokenHeaderKey = 'Authorization';
    const token = req.header(tokenHeaderKey)

    if (!token) {
        return res.status(401).json({ error: "用戶未登錄" });
    }

    const verified = await jwt.verify(token, jwtSecretKey);
    if (verified) {
        next()
    } else {
        return res.status(401).json({ error: "無(wú)效的token" });
    }
}
// 獲取用戶信息
app.get("/user/:username", isLogin, async (req, res) => {
    const username = req.params.username;
    const user = users.map(u => ({ id: u.id, username: u.username})).find(u => u.username === username)
    res.json(user);
});

總結(jié)

這篇文章我們介紹了JWT原理以及在nodejs中使用JWT 進(jìn)行鑒權(quán),除了JWT之外還可以使用session管理用戶狀態(tài),感興趣的可以??這里:https://blog.csdn.net/AC_greener/article/details/130036699

參考文章:

https://github.com/auth0/node-jsonwebtoken

https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
在Nodejs中使用JWT進(jìn)行鑒權(quán),JavaScript,node.js,前端,鑒權(quán)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-683093.html

到了這里,關(guān)于在Nodejs中使用JWT進(jìn)行鑒權(quán)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 將 Jupyter Notebook 用于 JavaScript (使用 Node.js 或 Deno 環(huán)境)

    熟悉 Python 的讀者, 可能同樣對(duì) IPython 或 Jupyter 等項(xiàng)目 (如 Jupyter Notebook) 有所耳聞. 正如其名, IPython 項(xiàng)目讓 Python 這門語(yǔ)言變得 “interactive”; 如: 交互式的 Shell 程序, 對(duì)交互式數(shù)據(jù)可視化以及 GUI 工具集的支持等等 (具體可見(jiàn) IPython 項(xiàng)目的網(wǎng)站). 比如在 Notebook 中, 用戶可以實(shí)現(xiàn)

    2024年02月07日
    瀏覽(19)
  • nodejs使用JWT(全)

    nodejs使用JWT(全)

    token表示令牌,用戶的登錄憑證。 基于 Token 的身份驗(yàn)證方法,使用基于 Token 的身份驗(yàn)證方法,在服務(wù)端不需要存儲(chǔ)用戶的登錄記錄。大概的流程是這樣的: 客戶端使用用戶名 跟密碼請(qǐng)求登錄 服務(wù)端收到請(qǐng)求,去驗(yàn)證用戶名與密碼 驗(yàn)證成功后,服務(wù)端會(huì)簽發(fā)一個(gè) Token,再把

    2024年02月08日
    瀏覽(14)
  • Node.js環(huán)境調(diào)用百度智能云(百度云)api鑒權(quán)認(rèn)證三步走

    Node.js環(huán)境調(diào)用百度智能云(百度云)api鑒權(quán)認(rèn)證三步走

    Postman腳本下載 下載Postman pre-request Script 設(shè)置 Authorization 示例腳本 簽名計(jì)算工具 https://cloud.baidu.com/signature/index.html 百度智能云提供了在線生成簽名工具,用戶僅需填寫必要請(qǐng)求信息、訪問(wèn)密鑰(包含訪問(wèn)密鑰ID(AK)和秘密訪問(wèn)密鑰(SK)),可快速生成認(rèn)證字符串。 文檔地址 https:

    2024年04月11日
    瀏覽(22)
  • 【Nodejs】Node.js開(kāi)發(fā)環(huán)境安裝

    【Nodejs】Node.js開(kāi)發(fā)環(huán)境安裝

    在命令窗口中輸入 node -v 可以查看版本 0.x 完全不技術(shù) ES6 4.x 部分支持 ES6 特性 5.x 部分支持ES6特性(比4.x多些),屬于過(guò)渡產(chǎn)品,現(xiàn)在來(lái)說(shuō)應(yīng)該沒(méi)有什么理由去用這個(gè)了 6.x 支持98%的 ES6 特性 8.x 支持 ES6 特性 去 Node.js 的官網(wǎng)下載安裝包: 我們也可以下載歷史版本。 后續(xù)如果

    2024年02月15日
    瀏覽(36)
  • Node.js | 使用 zlib 內(nèi)置模塊進(jìn)行 gzip 壓縮

    ??? NodeJS專欄:Node.js從入門到精通 ??? 博主的前端之路:前端之行,任重道遠(yuǎn)(來(lái)自大三學(xué)長(zhǎng)的萬(wàn)字自述) ?? 加入社區(qū)領(lǐng)紅包:海底燒烤店ai(從前端到全棧) ?????個(gè)人簡(jiǎn)介:即將大三的學(xué)生,一個(gè)不甘平庸的平凡人?? ?? 你的一鍵三連是我更新的最大動(dòng)力??!

    2024年02月02日
    瀏覽(26)
  • 微信小程序一鍵登錄功能,使用uni-app和springboot(JWT鑒權(quán))

    微信小程序一鍵登錄功能,使用uni-app和springboot(JWT鑒權(quán))

    目錄 概述 微信登錄接口說(shuō)明 ?關(guān)于獲取微信用戶的信息 前端代碼(uni-app) 后端代碼(SpringBoot) 配置文件:application.yml? 配置文件:Pom.xml? 類:WeChatModel?? ?類:WeChatSessionModel ?類:UserInfoController 業(yè)務(wù)層實(shí)現(xiàn)類:UserInfoServiceImpl 工具類:JWTUtils 攔截器配置-自定義攔截器

    2024年02月09日
    瀏覽(18)
  • 【nodejs】用Node.js實(shí)現(xiàn)簡(jiǎn)單的壁紙網(wǎng)站爬蟲(chóng)

    【nodejs】用Node.js實(shí)現(xiàn)簡(jiǎn)單的壁紙網(wǎng)站爬蟲(chóng)

    在這個(gè)博客中,我們將學(xué)習(xí)如何使用Node.js編寫一個(gè)簡(jiǎn)單的爬蟲(chóng)來(lái)從壁紙網(wǎng)站獲取圖片并將其下載到本地。我們將使用Axios和Cheerio庫(kù)來(lái)處理HTTP請(qǐng)求和HTML解析。 首先,確保你已經(jīng)安裝了Node.js環(huán)境。然后,我們將創(chuàng)建一個(gè)新的文件夾,初始化項(xiàng)目并安裝所需的依賴庫(kù): 編寫爬蟲(chóng)

    2024年02月12日
    瀏覽(28)
  • 「NodeJs進(jìn)階」超全面的 Node.js 性能優(yōu)化相關(guān)知識(shí)梳理

    「NodeJs進(jìn)階」超全面的 Node.js 性能優(yōu)化相關(guān)知識(shí)梳理

    相信對(duì)于前端同學(xué)而言,我們?nèi)ラ_(kāi)發(fā)一個(gè)自己的簡(jiǎn)單后端程序可以借助很多的nodeJs的框架去進(jìn)行快速搭建,但是從前端面向后端之后,我們會(huì)在很多方面會(huì)稍顯的有些陌生,比如「性能分析」,「性能測(cè)試」,「內(nèi)存管理」,「內(nèi)存查看」,「使用C++插件」,「子進(jìn)程」,「

    2024年02月01日
    瀏覽(26)
  • 使用WebApi+Vue3從0到1搭建《權(quán)限管理系統(tǒng)》:二、搭建JWT系統(tǒng)鑒權(quán)

    使用WebApi+Vue3從0到1搭建《權(quán)限管理系統(tǒng)》:二、搭建JWT系統(tǒng)鑒權(quán)

    視頻地址:【W(wǎng)ebApi+Vue3從0到1搭建《權(quán)限管理系統(tǒng)》系列視頻:搭建JWT系統(tǒng)鑒權(quán)-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設(shè)置鑒權(quán)屬性 二、新建模型 添加模型JwtSettingModel其中字段和appsettings.json中的字段一樣,如下 三、新建解析appsettings.json節(jié)點(diǎn)的幫助類

    2024年04月22日
    瀏覽(26)
  • 【Node.js從基礎(chǔ)到高級(jí)運(yùn)用】十三、NodeJS中間件高級(jí)應(yīng)用

    【Node.js從基礎(chǔ)到高級(jí)運(yùn)用】十三、NodeJS中間件高級(jí)應(yīng)用

    在現(xiàn)代web開(kāi)發(fā)中,Node.js因其高效和靈活性而備受青睞。其中,中間件的概念是構(gòu)建高效Node.js應(yīng)用的關(guān)鍵。在這篇博客文章中,我們將深入探討Node.js中間件的高級(jí)應(yīng)用,包括創(chuàng)建自定義中間件、使用第三方中間件等。我們將從基礎(chǔ)講起,逐步深入,旨在為讀者提供全面而深入

    2024年03月22日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包