如何将 JWT 令牌发送到 node.js 服务器

Posted

技术标签:

【中文标题】如何将 JWT 令牌发送到 node.js 服务器【英文标题】:How to send JWT token to node.js server 【发布时间】:2020-12-14 12:06:01 【问题描述】:

我编写了一个带有登录系统的小型 node.js 服务器,并试图保护我的路由。我创建了应该检查每个受保护路由上的身份验证的中间件,但似乎我没有正确发送 JWT 令牌,因为每次登录时都会收到 Authentication failed 消息。如果密码和用户名正确,如何正确发送 JWT 令牌并登录?这是我的 Node.js 服务器:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const cors = require('cors');
const mongoose = require('mongoose');
require('dotenv').config();
const PORT = process.env.PORT || 1337;
const jwt = require('jsonwebtoken');
const checkAuth = require('./middleware/check-auth.js')
let Post = require('./models/post.model.js');

app.use(cors());
app.use("/assets", express.static(__dirname + "/assets"));
app.use(bodyParser.urlencoded( extended: true ));

app.set('view-engine', 'ejs');

app.get('/', (req, res) => 
    res.render('index.ejs');
);

app.post('/', (req, res) => 
    let username = req.body.username;
    let password = req.body.password;


    if (username !== process.env.USER_NAME && password !== process.env.USER_PASSWORD) 
        res.json('Invalid credentials');

     else 
        const token = jwt.sign(
            username: username,
        , process.env.SECRET_KEY, 
            expiresIn: '1h'
        );

        res.redirect(`/dashboard?token=$token`);
    
);

app.get('/dashboard', checkAuth, (req, res) => 
    res.render('dashboard.ejs');
);

app.get('/dashboard/createPost', checkAuth, (req, res) => 
    res.render('post.ejs');
);

app.post('/dashboard/createPost', async (req, res) => 
    let collection = connection.collection(process.env.POSTS_WITH_TAGS);
    res.setHeader('Content-Type', 'application/json');
    let post = new Post(req.body);
    collection.insertOne(post)
        .then(post => 
            res.redirect('/dashboard')
        )
        .catch(err => 
            res.status(400).send(err);
        );
);

app.listen(PORT);

这是我的 check-auth 中间件:

const jwt = require('jsonwebtoken');

module.exports = (req, res, next) => 
    try 
        const token = req.headers.authorization.split(' ')[1];
        console.log(token);
        const decoded = jwt.verify(token, process.env.SECRET_KEY, null);
        req.body.decoded = decoded;
        console.log(req.body.decoded);
     catch (error) 
        return res.status(401).json(
            message: 'Authentication failed'
        );
    
    next();
;

【问题讨论】:

【参考方案1】:

使用 javascript fetch API 发送 JWT 令牌作为 header 授权

fetch('backend_domain/dashboard', 
     method: 'get',
     headers: 
       Authorization: JWT_Token
     
).then(data => ..your operation here..)

参考:fetch_mdn 以便更好地理解fetch API

【讨论】:

【参考方案2】:

我认为这里的问题是当您尝试在邮递员中将它作为 json 字符串传递时,您在 req.body 中得到一个空对象。我会推荐一个

    在邮递员的 x-www-form-urlencoded 标记中传递您的凭据或 使用 express.Router() 并为路由创建不同的文件

在你的 index.js 文件中写:

app.use('/', require('./routes.js'))

并创建一个名为 routes.js 的文件并将您的路线如下所示:

const express = require('express');
const router = express.Router();
router.post('/', (req, res) => 
 let username = req.body.username;
 let password = req.body.password;

console.log(req.body);
 if (username !== process.env.USER_NAME && password !== process.env.USER_PASSWORD) 
     res.json('Invalid credentials');

  else 
     const token = jwt.sign(
         username: username
     , process.env.SECRET_KEY, 
         expiresIn: 3600
     );

     return res.send(token);
 
);

module.exports = router;

【讨论】:

这样用户在发送令牌后不会被重定向到页面,这就是我这样发送它的原因: res.redirect(/dashboard?token=$token);我无法发送两个回复。 so 而不是 res.send(token) 只是在路由器中返回 res.redirect

以上是关于如何将 JWT 令牌发送到 node.js 服务器的主要内容,如果未能解决你的问题,请参考以下文章

快速中间件中的 Node.js JWT 刷新令牌

Node.js:登录后在 URL 中发送带有令牌(JWT)的新请求

如何延长node.js中相同jwt令牌的到期时间

如何解码 Java 生成的 Node.js 中的 jwt 令牌?

如何在 Node JS 中使用 jwt 授权具有不同令牌的所有用户

在 Volley 请求中添加 JWT 令牌