NodeJS 我应该如何从Express中间件中调用一个CMAC函数?

zpjtge22  于 2023-11-17  发布在  Node.js
关注(0)|答案(1)|浏览(133)

我已经能够将这个问题简化为一个单文件示例,该示例应该可以很容易地在Express 5.0.0-beta.1中重现。
我正在编写一个Express中间件函数,它实现了基本的JWT身份验证。(如果不存在/格式错误,则返回401),然后将令牌插入我们将调用的内部函数validateToken,该函数返回Promise。**我相信这是Stack Overflow上的一个独特问题,this question是关于从 * 在端点处理程序 * 中进行一个BRAC调用,但是我需要从 * 中间件函数 * 中发出一个codec调用。
我试着用下面的方法实现它:

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

class HttpError {
    constructor(status, message) {
        this.status = status
        this.message = message
    }
}

// Auth middleware
const authMiddleware = (req, res, next) => {

        const token = req.header('Authorization');
        if (!token) {
            console.info("No JWT in request")
            return next(new HttpError(401, 'Unauthorized'))
        }
    
        const regex = /^Bearer (.+)$/;
        const jwt = regex.exec(token)[1];
    
        if (!jwt) {
            console.info("Malformed JWT")
            return next(new HttpError(401, 'Unauthorized'))
        }

        return validateToken({jwt: jwt, path: '/secured'})
            .then((response) => next())
            .catch(err => next(new HttpError(403, 'Forbidden')))   
}
app.use(authMiddleware)

// Endpoint definitions
app.get('/secured', (req, res) => {
    console.info('endpoint handler invoked')
    res.send('Valid token')
})

// Error handlers
function errorMiddleware(error, req, res, next) {
    console.info(`error middleware hit: ${JSON.stringify(error)}`)
    if (!error.status || error.status >= 500) {
        return res.status(error.status || 500).send();
    }
            
    res.status(error.status).json({ message: error.message });
}
app.use(errorMiddleware)

app.listen(8080);

字符串
当我发送一个没有Authorization头部的请求,并且前两个if块中的一个被触发(返回next(new HttpError(...))时,应用程序立即向客户端发出401 Unauthorized响应。但是当我发送一个头部中带有 * 令牌的请求时,应用程序会无限期地挂起中间件函数的最后一行return validateToken(...)
有人告诉我Express 5.x会自动处理中间件函数中被拒绝的promise,但即使升级到Express 5,应用程序在调用validateToken函数时仍然会无限期地挂起。

s4chpxco

s4chpxco1#

事实证明,我调用的validateToken函数有一些非常奇怪的行为-在验证令牌之前,它等待对AWS元数据服务的HTTP调用以获取有关系统的一些信息。我以为我的J2EE Express代码出错了,但实际上对AWS的调用需要75秒才超时,超时后,操控者的功能完全正常
下面是一个Express服务器的单文件示例,它在中间件 * 中等待一个CMAC操作 *,希望这对将来的人有所帮助:

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

class HttpError {
    constructor(status, message) {
        this.status = status
        this.message = message
    }
}

// Auth middleware
const authMiddleware = (req, res, next) => {

        const token = req.header('Authorization');
        if (!token) {
            console.info("No JWT in request")
            return next(new HttpError(401, 'Unauthorized'))
        }
    
        const regex = /^Bearer (.+)$/;
        const jwt = regex.exec(token)[1];
    
        if (!jwt) {
            console.info("Malformed JWT")
            return next(new HttpError(401, 'Unauthorized'))
        }

        // Assume that `validateToken` is a function returning a promise with either the token's claims or an error
        return this.validateToken({jwt: jwt, path: '/secured'})
            .then((response) => next())
            .catch(err => next(new HttpError(403, 'Forbidden')))   
}

// Invoke authMiddleware function for all endpoints that begin with '/secured'
app.use('/secured', authMiddleware)

// Endpoint definitions
app.get('/secured', (req, res) => {
    res.send('Valid token')
})

app.get('/unsecured', (req, res) => res.send('Unsecured endpoint'))

// Error handlers
function errorMiddleware(error, req, res, next) {
    console.debug(`Error caught by Express error handler: ${JSON.stringify(error)}`)
    if (!error.status || error.status >= 500) {
        return res.status(error.status || 500).send();
    }
    
    res.status(error.status).json({ message: error.message });
}
app.use(errorMiddleware)

app.listen(8080);

字符串

相关问题