【问题标题】:RESTful API access token mechanismRESTful API 访问令牌机制
【发布时间】:2021-01-12 14:21:04
【问题描述】:

我正在使用 Express、Body-parser 和 MySQL 为业务管理系统开发 JavaScript/MySQL RESTful API。目前,我正在研究访问令牌。在任何 API 调用之前,正文必须包含一个正在由 API 验证的 API 密钥。在每个 API 调用函数中,我首先检查访问令牌是否存在,如果存在,则 API 执行 MySQL 命令并发回结果。 重要的是我想创建一个函数来检查访问令牌是否存在并返回 true 或 false。但是,我不知道如何从 conn.query() 方法返回这个布尔值。任何帮助将不胜感激,我很绝望。 这是我的代码:

function checkApiKey(apiKey) {
  let sql = "SELECT * FROM apikeys WHERE apikey = '" + apiKey + "'";
  conn.query(sql, (err, results) => {
    if (err) throw err;

    if (results.length > 0) return true;

    return false;
  });
}

app.get("/api/users",(req, res) => {
  if (checkApiKey(req.body.apiKey)) {
    let sql = "SELECT * FROM users";
    let query = conn.query(sql, (err, results) => {
      if (err) throw err;
      res.send(results);
    });
  }
});

但是,checkApiKey() 方法返回 undefined...

【问题讨论】:

标签: javascript mysql api express body-parser


【解决方案1】:

您的checkApiKey 函数返回未定义,因为您的逻辑在 sql 的回调函数中返回 true 或 false。

我推荐另一种方法,使用 checkApiKey 作为中间件函数:

const checkApiKey = (req, res, next) => {
  conn.query("SELECT * FROM apikeys WHERE apikey = ?", [req.body.apiKey], (err, result) => {
    if (err) throw err
    if (results)
      next() // continue to next router function
    else
      res.status(403).end('Unauthorized') // resolve with 403
  })
}

app.get("/api/users",
        checkApiKey, // middleware auth function
        (req, res) => {
  conn.query("SELECT * FROM users", (err, results) => {
    if (err) throw err;
    res.send(results)
  })
})

【讨论】:

  • 这正是我想要的,就像一个魅力,谢谢!关于您的答案的另一个问题,将req.body.apiKey 实现到 sql 查询字符串与您使用问号和值作为第二个参数的方法有什么区别?
  • 很高兴能帮上忙 :) 通过?s 将值传递给查询主要有助于转义值以防止 SQL 注入攻击。此外,我发现查询更简洁:-) 见npmjs.com/package/mysql#escaping-query-values
猜你喜欢
  • 2017-10-08
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2023-02-02
  • 1970-01-01
相关资源
最近更新 更多