从节点 API 端点解析表达式(布尔值)
Resolve Expression from Node API Endpoint (Boolean)
我正在尝试验证 API 键 运行 和 API 端点函数。
server.js
let db = require("./sql/rest_functions") // Custom modules
let session = require("./sql/session_management")
app.get("/node/api/mssql/test", function(req, res) {
if(session.validateKey(req)) {
db.mssqlQuery(req, res)
}
})
session.js
exports.validateKey = function(req) {
return sql.connect(config.properties)
.then(pool => {
return pool.request()
.query("SELECT CASE WHEN EXISTS (SELECT * FROM Login WHERE (username = '" + req.header("username") + "' AND apiKey = '" + req.header("apiKey") + "')) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END")
.then(response => {
console.log(typeof response[0]['']) // returns boolean
return response[0][''] // return nested value to get true / false response
})
})
}
validateKey
函数返回 true 和 false(我认为是纯文本),我希望它解析为可以传递到 API 测试函数的布尔值。
我已经尝试过这种 JSON.parse
方法和 session.validateKey(req) == 'true'
设计模式,但两种情况都无法解决预期的行为。
如何解析返回值以验证用户的凭据?
我建议简单地 return 计算数据库中的行数并验证是否存在 1
个条目(或多个条目,具体取决于您的数据结构)。
请注意,要减轻 SQL 注入,您必须使用 参数绑定 ,如下所示;该库不 "automatically" 防止注入,as per the documentation 如果您不使用参数绑定。将 VarChar(100)
更改为这些字段的任何列类型。
exports.validateKey = async function(req) {
return await sql.connect(config.properties)
.then(pool => pool.request()
.input('user', sql.VarChar(100), req.header("username"))
.input('key', sql.VarChar(100), req.header("apiKey"))
.query('SELECT COUNT(*) AS valid FROM Login WHERE username = @user AND apiKey = @key')
.then(response => result.recordset[0].valid === 1)
)
}
请注意 validateKey
将 return 布尔值 Promise,因此我们添加了 async
/await
以节省修改路由控制器。
请注意,我已经从大多数粗箭头函数中删除了大括号:它们都是一个语句,所以它们是 。
警告:我实际上不能尝试这个,这是阅读文档后的有根据的猜测。希望对你有帮助。
我正在尝试验证 API 键 运行 和 API 端点函数。
server.js
let db = require("./sql/rest_functions") // Custom modules
let session = require("./sql/session_management")
app.get("/node/api/mssql/test", function(req, res) {
if(session.validateKey(req)) {
db.mssqlQuery(req, res)
}
})
session.js
exports.validateKey = function(req) {
return sql.connect(config.properties)
.then(pool => {
return pool.request()
.query("SELECT CASE WHEN EXISTS (SELECT * FROM Login WHERE (username = '" + req.header("username") + "' AND apiKey = '" + req.header("apiKey") + "')) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END")
.then(response => {
console.log(typeof response[0]['']) // returns boolean
return response[0][''] // return nested value to get true / false response
})
})
}
validateKey
函数返回 true 和 false(我认为是纯文本),我希望它解析为可以传递到 API 测试函数的布尔值。
我已经尝试过这种 JSON.parse
方法和 session.validateKey(req) == 'true'
设计模式,但两种情况都无法解决预期的行为。
如何解析返回值以验证用户的凭据?
我建议简单地 return 计算数据库中的行数并验证是否存在 1
个条目(或多个条目,具体取决于您的数据结构)。
请注意,要减轻 SQL 注入,您必须使用 参数绑定 ,如下所示;该库不 "automatically" 防止注入,as per the documentation 如果您不使用参数绑定。将 VarChar(100)
更改为这些字段的任何列类型。
exports.validateKey = async function(req) {
return await sql.connect(config.properties)
.then(pool => pool.request()
.input('user', sql.VarChar(100), req.header("username"))
.input('key', sql.VarChar(100), req.header("apiKey"))
.query('SELECT COUNT(*) AS valid FROM Login WHERE username = @user AND apiKey = @key')
.then(response => result.recordset[0].valid === 1)
)
}
请注意 validateKey
将 return 布尔值 Promise,因此我们添加了 async
/await
以节省修改路由控制器。
请注意,我已经从大多数粗箭头函数中删除了大括号:它们都是一个语句,所以它们是
警告:我实际上不能尝试这个,这是阅读文档后的有根据的猜测。希望对你有帮助。