欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

jwt在express中token的加密解密實(shí)現(xiàn)過(guò)程

 更新時(shí)間:2025年01月13日 10:03:02   作者:小灰灰學(xué)編程  
文章詳細(xì)介紹了JWT在Node.js中的生成和驗(yàn)證過(guò)程,包括設(shè)置密鑰、使用中間件進(jìn)行token驗(yàn)證等步驟,并提供了一個(gè)完整的示例代碼,感興趣的朋友跟隨小編一起看看吧

在我們前面學(xué)習(xí)了 JWT認(rèn)證機(jī)制在Node.js中的詳細(xì)闡述 之后,今天來(lái)詳細(xì)學(xué)習(xí)一下token是如何生成的,secret密鑰的加密解密過(guò)程是怎么樣的。

安裝依賴(lài)

  • express:用于創(chuàng)建服務(wù)器
  • jsonwebtoken:用于生成和驗(yàn)證JWT
  • body-parser:用于解析請(qǐng)求體中的數(shù)據(jù)
npm install express jsonwebtoken body-parser

設(shè)置密鑰

SECRET_KEY:用于簽名和驗(yàn)證JWT的密鑰。請(qǐng)確保在生產(chǎn)環(huán)境中使用更安全的方式存儲(chǔ)密鑰。

// 密鑰(請(qǐng)確保在生產(chǎn)環(huán)境中使用更安全的方式存儲(chǔ)密鑰)
const SECRET_KEY = 'your_secret_key';

中間件

bodyParser.json():解析請(qǐng)求體。

// 中間件:解析請(qǐng)求體
app.use(bodyParser.urlencoded({extended: false}))

authenticateJWT:驗(yàn)證JWT的中間件。如果驗(yàn)證失敗,返回403狀態(tài)碼。

// 中間件:驗(yàn)證JWT
const authenticateJWT = (req, res, next) => {
    const token = req.headers.authorization;
    if (!token) {
        return res.sendStatus(403);
    }
    jwt.verify(token, SECRET_KEY, (err, user) => {
        if (err) {
            return res.sendStatus(403);
        }
        console.log(user, 'user')
        req.user = user;
        next();
    });
};

路由

/register:模擬用戶(hù)注冊(cè)并生成JWT。

// 路由:注冊(cè)用戶(hù)(示例,僅用于生成token)
app.post('/register', (req, res) => {
    const { username, password } = req.body;
    // 在實(shí)際場(chǎng)景中,您應(yīng)該驗(yàn)證用戶(hù)并存儲(chǔ)其信息
    // 這里僅假設(shè)用戶(hù)驗(yàn)證成功
    if (username && password) {
        // 通過(guò)jwt.sign() 生成JWT字符串,
        // 三個(gè)參數(shù)分別是:1-用戶(hù)信息對(duì)象(不要把密碼進(jìn)行加密),2-加密密鑰,3-配置對(duì)象 expiresIn-配置token有效期
        const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
        res.json({
            message: 'User registered successfully',
            token: token
        });
    } else {
        res.status(400).json({ message: 'Invalid credentials' });
    }
});

/protected:受保護(hù)的路由,需要驗(yàn)證JWT才能訪(fǎng)問(wèn)。

// 路由:受保護(hù)的資源
app.get('/protected', authenticateJWT, (req, res) => {
    res.json({
        message: 'This is a protected route',
        user: req.user
    });
});

運(yùn)行服務(wù)器

服務(wù)器在3000端口運(yùn)行,你可以通過(guò)http://localhost:3000訪(fǎng)問(wèn)。

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

效果

完整代碼

const express = require('express');
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');
const app = express();
const port = 3000;
// 密鑰(請(qǐng)確保在生產(chǎn)環(huán)境中使用更安全的方式存儲(chǔ)密鑰)
const SECRET_KEY = 'your_secret_key';
// 中間件:解析請(qǐng)求體
app.use(bodyParser.urlencoded({extended: false}))
// 路由:注冊(cè)用戶(hù)(示例,僅用于生成token)
app.post('/register', (req, res) => {
    const { username, password } = req.body;
    // 在實(shí)際場(chǎng)景中,您應(yīng)該驗(yàn)證用戶(hù)并存儲(chǔ)其信息
    // 這里僅假設(shè)用戶(hù)驗(yàn)證成功
    if (username && password) {
        // 通過(guò)jwt.sign() 生成JWT字符串,
        // 三個(gè)參數(shù)分別是:1-用戶(hù)信息對(duì)象(不要把密碼進(jìn)行加密),2-加密密鑰,3-配置對(duì)象 expiresIn-配置token有效期
        const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
        res.json({
            message: 'User registered successfully',
            token: token
        });
    } else {
        res.status(400).json({ message: 'Invalid credentials' });
    }
});
// 中間件:驗(yàn)證JWT
const authenticateJWT = (req, res, next) => {
  console.log(req.headers, 'req.headers')
    const token = req.headers.authorization;
    if (!token) {
        return res.sendStatus(403);
    }
    console.log(token, 'token')
    jwt.verify(token, SECRET_KEY, (err, user) => {
        if (err) {
            return res.sendStatus(403);
        }
        console.log(user, 'user')
        req.user = user;
        next();
    });
};
// 路由:受保護(hù)的資源
app.get('/protected', authenticateJWT, (req, res) => {
    res.json({
        message: 'This is a protected route',
        user: req.user
    });
});
app.listen(port, () => {
    console.log(`Server is running on http://localhost:${port}`);
});

除了 jwt.verify進(jìn)行token驗(yàn)證之外,還可以使用 express-jwt 中間件。

在Express應(yīng)用中,express-jwt(現(xiàn)在通常稱(chēng)為express-jwt-ez,因?yàn)樗莈xpress-jwt的一個(gè)更現(xiàn)代、更輕量級(jí)的替代品)是一個(gè)中間件,用于驗(yàn)證JWT(JSON Web Tokens)。它會(huì)自動(dòng)從請(qǐng)求中提取JWT,并使用提供的密鑰或密鑰函數(shù)來(lái)解密(驗(yàn)證)它。如果JWT有效,中間件會(huì)將解碼后的負(fù)載(payload)附加到請(qǐng)求對(duì)象上,以便后續(xù)的處理程序(handler)可以使用。

安裝express-jwt

npm install express-jwt

配置JWT中間件

// 配置JWT中間件
app.use(jwt({
    secret: SECRET_KEY,
    algorithms: ['HS256'] // 指定用于簽名JWT的算法(這里使用的是HS256)
}).unless({
    path: ['/generate-token', /^\/public\//] // 指定哪些路徑應(yīng)該跳過(guò)JWT驗(yàn)證(例如,生成token的端點(diǎn)和公共資源的端點(diǎn))
}));

需要注意的是,在使用此方法進(jìn)行token校驗(yàn)時(shí),Authorization 的value指前面需要包含"Bearer "字符串。

完整代碼

const express = require('express');
const expressjwt = require('express-jwt');
const jwt = require('jsonwebtoken');
const app = express();
const port = 3000;
// 密鑰(請(qǐng)確保在生產(chǎn)環(huán)境中使用更安全的方式存儲(chǔ)密鑰)
const SECRET_KEY = 'your_secret_key_here';
// 中間件:解析請(qǐng)求體
app.use(bodyParser.urlencoded({extended: false}))
// 配置JWT中間件
app.use(expressjwt({
    secret: SECRET_KEY,
    algorithms: ['HS256'] // 指定用于簽名JWT的算法(這里使用的是HS256)
}).unless({
    path: ['/generate-token', /^\/public\//] // 指定哪些路徑應(yīng)該跳過(guò)JWT驗(yàn)證(例如,生成token的端點(diǎn)和公共資源的端點(diǎn))
}));
// 路由:生成JWT(這個(gè)端點(diǎn)不需要JWT驗(yàn)證)
app.post('/generate-token', (req, res) => {
    const { username } = req.body;
    if (!username) {
        return res.status(400).json({ message: 'Username is required' });
    }
    // 生成JWT(在實(shí)際應(yīng)用中,你可能還會(huì)包含其他信息,如用戶(hù)ID、角色等)
    const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
    res.json({
        message: 'Token generated successfully',
        token: token
    });
});
// 路由:受保護(hù)的資源(這個(gè)端點(diǎn)需要JWT驗(yàn)證)
app.get('/protected', (req, res) => {
    // 如果JWT驗(yàn)證成功,req.auth 將包含解碼后的負(fù)載(payload)
    const { username } = req.auth;
    res.json({
        message: 'This is a protected route',
        user: {
            username: username
        }
    });
});
app.listen(port, () => {
    console.log(`Server is running on http://localhost:${port}`);
});

到此這篇關(guān)于jwt在express中token的加密解密實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)jwt express token加密解密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • node.js實(shí)現(xiàn)學(xué)生檔案管理

    node.js實(shí)現(xiàn)學(xué)生檔案管理

    這篇文章主要為大家詳細(xì)介紹了node.js實(shí)現(xiàn)學(xué)生檔案管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • NodeJS落地WebSocket實(shí)踐前端架構(gòu)師破局技術(shù)

    NodeJS落地WebSocket實(shí)踐前端架構(gòu)師破局技術(shù)

    這篇文章主要為大家介紹了NodeJS落地WebSocket實(shí)踐前端架構(gòu)師破局技術(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • nodejs實(shí)現(xiàn)的連接MySQL數(shù)據(jù)庫(kù)功能示例

    nodejs實(shí)現(xiàn)的連接MySQL數(shù)據(jù)庫(kù)功能示例

    這篇文章主要介紹了nodejs實(shí)現(xiàn)的連接MySQL數(shù)據(jù)庫(kù)功能,結(jié)合實(shí)例形式分析了nodejs連接及查詢(xún)mysql數(shù)據(jù)的相關(guān)操作步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-01-01
  • 一文秒懂nodejs中的異步編程

    一文秒懂nodejs中的異步編程

    這篇文章主要介紹了深入理解nodejs中的異步編程,本文給大家介紹的非常想詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 一文教你如何使用Node進(jìn)程管理工具-pm2

    一文教你如何使用Node進(jìn)程管理工具-pm2

    這篇文章詳細(xì)介紹了如何使用node進(jìn)程管理工具pm2,文中代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以借鑒一下
    2023-04-04
  • nodejs實(shí)現(xiàn)百度輿情接口應(yīng)用示例

    nodejs實(shí)現(xiàn)百度輿情接口應(yīng)用示例

    這篇文章主要介紹了nodejs實(shí)現(xiàn)百度輿情接口應(yīng)用,結(jié)合實(shí)例形式分析了node.js調(diào)用百度輿情接口的具體使用技巧,需要的朋友可以參考下
    2020-02-02
  • Express框架搭建項(xiàng)目的實(shí)現(xiàn)步驟

    Express框架搭建項(xiàng)目的實(shí)現(xiàn)步驟

    Express是一個(gè)基于Node.js平臺(tái)的輕量級(jí)Web應(yīng)用框架,它提供了簡(jiǎn)潔的API和豐富的功能,本文主要介紹了Express框架搭建項(xiàng)目的實(shí)現(xiàn)步驟,感興趣的可以了解一下
    2024-06-06
  • 如何用Node.js編寫(xiě)內(nèi)存效率高的應(yīng)用程序

    如何用Node.js編寫(xiě)內(nèi)存效率高的應(yīng)用程序

    這篇文章主要介紹了如何用Node.js編寫(xiě)內(nèi)存效率高的應(yīng)用程序,對(duì)Node.js感興趣的同學(xué),可以參考下
    2021-04-04
  • Node.js斷點(diǎn)續(xù)傳的實(shí)現(xiàn)

    Node.js斷點(diǎn)續(xù)傳的實(shí)現(xiàn)

    最近做了個(gè)項(xiàng)目,應(yīng)項(xiàng)目需求,需要傳圖片、Excel等,幾M的大小可以很快就上傳到服務(wù)器,但是大的就需要斷點(diǎn)上傳,本文就介紹一下,感興趣的可以了解一下
    2021-05-05
  • 新入門(mén)node.js必須要知道的概念(必看篇)

    新入門(mén)node.js必須要知道的概念(必看篇)

    下面小編就為大家?guī)?lái)一篇新入門(mén)node.js必須要知道的概念(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08

最新評(píng)論