问题
我创建了一个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();
});
答案 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
。