如何在NodeJs中为选择性API添加"授权"检查?

Dea*_*ose 1 javascript node.js

我有一个基于react + node的项目,我在dist/目录中构建所有基于反应的组件,然后将此目录上传到服务器并通过nodeJS express.static()方法提供.

server.use(express.static(__ dirname +'/ dist'))

我还编写了一个节点中间件,它捕获每个请求并检查auth令牌是否传递给它.

users.use(function(req, res, next) {
    const token = req.headers.authorization
    if (token) {
        jwt.verify(token, process.env.SECRET_KEY, function(err) {
            if (err) {
                res.status(400).json({message : err})
            } else {
                next();
            }
        });
    } else {
        res.status(400).json({message : 'Please send a token'})
    }
})
Run Code Online (Sandbox Code Playgroud)

但是现在我面临的问题是,当我运行URL时http://localhost:3001/dashboard,节点中间件也会捕获它并检查令牌而不是渲染我的webview.

如何在nodeJS中区分webview请求和其他服务器请求

NAV*_*VIN 5

如果您需要仅针对某些特定API检查auth,您可以通过以下3种方式执行:

  1. 编写在auth检查功能之前/之前不使用auth的所有功能(API)

`

users.get('/yourAPI1', function(req, res, next) {
    //Do your stuff
});

users.get('/yourAPI2', function(req, res, next) {
    //Do your stuff
});

users.get('/yourAPI3', function(req, res, next) {
    //Do your stuff
});

users.use(function(req, res, next) {
    const token = req.headers.authorization
    if (token) {
        jwt.verify(token, process.env.SECRET_KEY, function(err) {
            if (err) {
                res.status(400).json({message : err})
            } else {
                next();
            }
        });
    } else {
        res.status(400).json({message : 'Please send a token'})
    }
});

//Now those functions which need auth checks
users.post('/yourAPI4', function(req, res, next) {
    //Do your stuff
});

users.post('/yourAPI5', function(req, res, next) {
    //Do your stuff
});
Run Code Online (Sandbox Code Playgroud)

`

  1. 修改您的Auth功能以跳过所有GETAPI.注意:仅当您用于GET加载HTML页面而不是获取搜索任何其他信息等数据时,才使用此选项.

`

users.use(function(req, res, next) {
    //Just a check for `GET` API
    if(req.method === 'GET') {return next();}

    const token = req.headers.authorization
    if (token) {
        jwt.verify(token, process.env.SECRET_KEY, function(err) {
            if (err) {
                res.status(400).json({message : err})
            } else {
                next();
            }
        });
    } else {
        res.status(400).json({message : 'Please send a token'})
    }
});
Run Code Online (Sandbox Code Playgroud)

`

  1. 仅从那些需要检查auth的API调用Auth函数:

`

function checkAuth (req, res, next) {

    const token = req.headers.authorization
    if (token) {
        jwt.verify(token, process.env.SECRET_KEY, function(err) {
            if (err) {
                res.status(400).json({message : err})
            } else {
                next();
            }
        });
    } else {
        res.status(400).json({message : 'Please send a token'})
    }
});

//Escaping auth check
users.get('/yourAPI6', function(req, res, next) {
    //Do your stuff
});

//Need auth for this
users.get('/yourAPI7', checkAuth, function(req, res, next) {
    //Do your stuff
});

users.post('/yourAPI8', function(req, res, next) {
    //Do your stuff
});

users.post('/yourAPI9', checkAuth function(req, res, next) {
    //Do your stuff
});

users.put('/yourAPI10', function(req, res, next) {
    //Do your stuff
});

users.put('/yourAPI11', checkAuth function(req, res, next) {
    //Do your stuff
});
Run Code Online (Sandbox Code Playgroud)

`

在所有这些中,我会更喜欢第三个,因为它为您提供了灵活性,可以在任何需要的地方使用.