Node.js和Express排除路由形式JWT中间件

问题描述 投票:0回答:1

我试图排除特定路由的JWT身份验证。我成功地能够将其排除在某些路线上,但不能用于其他路线。我发布下面的代码。

我不需要身份验证进入下面提到的路线,它工作正常。

app.post('/api/register*', function(request,response, next){
    console.log("Entered register/user function");
    registerProxy(request, response, next);
});

我需要身份验证才能输入下面提到的路线,它运行正常。

app.get('/api/users*', protected, function(request, response, next){
    console.log('Entered userinfo function');
    userInformationProxy(request,response,next);
});

以下是我的“受保护”功能

function protected(request, response, next) {
    console.log('Entered function to strip jwt');
    console.log(request.method, request.url);
    const bearerHeader = request.headers['authorization'];
    if(typeof bearerHeader !== 'undefined'){
        console.log('JWT is present');
        const bearer = bearerHeader.split(' ');
        const bearerToken = bearer[1];
        request.token = bearerToken;
        jwt.verify(request.token, secretKey, function(error, authData){
            if(error){
                response
                    .status(403)
                    .json({'message': 'Forbidden'})
            } else{
                console.log(authData);
                if(request.url.includes(authData.username)){
                    next();
                } else{
                    response
                        .status(403)
                        .json({'message': 'Forbidden'})
                }
            }
        });
    } else {
        response
            .status(403)
            .json({'message': 'Forbidden'})
    }};
}

但是当我试图进入下面提到的路线时,我遇到了一个问题:

app.get('/api/search', function(request, response, next){
    console.log('Entered search function');
    searchProxy(request, response,next);
});

虽然我没有用“受保护”功能来保护这条路线,但它禁止给我一个错误403

我做错了吗?我是Node.js和JWT的新手

node.js express routes authorization jwt
1个回答
0
投票

只需确保此路由定义:

app.get('/api/search', function(request, response, next){
    console.log('Entered search function');
    searchProxy(request, response,next);
});

在此之前:

app.get('/api/users*', protected, function(request, response, next){
    console.log('Entered userinfo function');
    userInformationProxy(request,response,next);
});

而且,你发送searchProxy()的回复,不要打电话给next()。如果您发送响应并且不调用next(),则不会运行其他路由,因此无法访问您的protected()中间件。

© www.soinside.com 2019 - 2024. All rights reserved.