如何使用节点/快递对METHOD GET请求进行身份验证

时间:2020-06-30 16:58:51

标签: javascript node.js express authentication

问题

我创建了一个api,当我收到请求时它会返回数据数组。该API网址必须由外部开发团队使用。

我要实现的是,只有他们才可以访问端点/api/verily

有一种方法可以使具有api密钥的团队访问终结点?如果可能的话,如何实施?

感谢您的帮助!

app.get('/api/verily', (req, res) => {
    new sql.ConnectionPool(config)
        .connect()
        .then((pool) => {
            return pool
                .request()
                .query(
                    "QUERY REMOVED... DESMOSTRATION ONLY"
                );
        })
        .then((result) => {
            Object.keys(result.recordset[0]).forEach(function (item) {
                const ft = JSON.parse(result.recordset[0][item]);
                res.setHeader('Access-Control-Allow-Origin', '*');
                res.status(200).json(ft);
            });
        })
        .catch((err) => {
            res.status(500).send({ message: err });
        });

    sql.close();
});

3 个答案:

答案 0 :(得分:0)

您可以通过实现中间件来实现相同目的。 您可以定义一个中间件函数,该函数将验证通过标头或请求参数发送的API是否真实,如果一切正常,则一旦中间件使用next()返回调用,就可以将add true添加到req.body.isAuthentic中。路由,您可以在req.body.isAuthentic中检查它是否返回true或false并继续!

示例:

var express = require('express');  
var app = express();  
app.get('/', middlware, function(req, res, next) {
if (req.body.isAuthentic) {
res.send('Hello World!');  }
});  
function middlware(req, res, next) {  
// check whether api is authentic
// if authentic then add req.body.isAuthentic = true;  
next();  
};
var server = app.listen(8000, function () {  
var host = server.address().address  
var port = server.address().port  
console.log("Example app listening at http://%s:%s", host, port)  
})

答案 1 :(得分:0)

您可以将中间件编写为-

function auth(req, res, next) {
  // Extract token from the request header.
  const token = req.header("auth-token")

  // Check if token exists
  if (!token) return res.status(401).json({ msg: "Access Denied." })

  try {
    const verified = verifyTheToken(inputToken, Actual Token)
    req.user = verified
    next()
  } catch (e) {
    res.status(400).json({ msg: "Invalid Token." })
  }
}

module.exports = auth

现在,您可以像这样将名为verifyToken(假设)的中间件添加到您的get请求中-

const verify = require("import/above/middleware/verifyToken.js")

app.get('/api/verily', auth, (req, res) => {
    new sql.ConnectionPool(config)
        .connect()
        .then((pool) => {
            return pool
                .request()
                .query(
                    "QUERY REMOVED... DESMOSTRATION ONLY"
                );
        })
        .then((result) => {
            Object.keys(result.recordset[0]).forEach(function (item) {
                const ft = JSON.parse(result.recordset[0][item]);
                res.setHeader('Access-Control-Allow-Origin', '*');
                res.status(200).json(ft);
            });
        })
        .catch((err) => {
            res.status(500).send({ message: err });
        });

    sql.close();
});

答案 2 :(得分:0)

如果要保护的端点不止一个,那么middleware可能是可行的方法。如果您真正关心的只是使用固定的API密钥保护单个端点,并且您的使用者将把该密钥作为查询参数(例如key)传递,则可以:

const MY_API_KEY = "some-secret-value";

app.get('/api/verily', (req, res) => {
  if (req.query.key !== MY_API_KEY) {
    res.status(401).send('Unauthorized');
  } else {
    // HANDLE APPROVED REQUEST HERE
  }
});

请求将转到/api/verily?key=some-secret-value