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

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ò)程是怎么樣的。

安裝依賴

  • 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:模擬用戶注冊(cè)并生成JWT。

// 路由:注冊(cè)用戶(示例,僅用于生成token)
app.post('/register', (req, res) => {
    const { username, password } = req.body;
    // 在實(shí)際場(chǎng)景中,您應(yīng)該驗(yàn)證用戶并存儲(chǔ)其信息
    // 這里僅假設(shè)用戶驗(yàn)證成功
    if (username && password) {
        // 通過(guò)jwt.sign() 生成JWT字符串,
        // 三個(gè)參數(shù)分別是:1-用戶信息對(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才能訪問(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訪問(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è)用戶(示例,僅用于生成token)
app.post('/register', (req, res) => {
    const { username, password } = req.body;
    // 在實(shí)際場(chǎng)景中,您應(yīng)該驗(yàn)證用戶并存儲(chǔ)其信息
    // 這里僅假設(shè)用戶驗(yàn)證成功
    if (username && password) {
        // 通過(guò)jwt.sign() 生成JWT字符串,
        // 三個(gè)參數(shù)分別是:1-用戶信息對(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)在通常稱為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ì)包含其他信息,如用戶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)文章

最新評(píng)論

裕民县| 麻城市| 谢通门县| 临潭县| 昌都县| 乌兰浩特市| 东丰县| 昭通市| 玉门市| 保山市| 水富县| 柘城县| 金堂县| 阜平县| 福海县| 松溪县| 盘山县| 黔南| 乌鲁木齐县| 阜阳市| 商都县| 绥芬河市| 苏尼特左旗| 介休市| 莫力| 济源市| 克什克腾旗| 新乐市| 阳山县| 页游| 清新县| 文登市| 香港 | 获嘉县| 汨罗市| 商都县| 东乡县| 会同县| 乌鲁木齐市| 绥江县| 开化县|