从Node API端点解析表达式(布尔值)

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

我正在尝试验证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'设计模式,但两种情况都没有解决预期的行为。

如何解析返回的值以验证用户的凭据?

javascript sql-server node.js session credentials
1个回答
1
投票

我建议只返回数据库中的行数,并验证是否存在1条目(或多个条目,具体取决于数据的结构)。

请注意,要缓解SQL注入,必须使用参数绑定,如下所示;如果你不使用参数绑定,库不会“自动”防止注入,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将返回布尔值Promise,因此我们添加了async/await以保存修改路径控制器。

请注意,我从大多数胖箭头函数中删除了大括号:它们都是一个语句,所以它们是redundant

警告:我实际上无法尝试这一点,这是通过阅读文档的有根据的猜测。我希望它有所帮助。

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