mongodb 如何限制express api只允许来自客户端的post请求?

2izufjch  于 2022-11-22  发布在  Go
关注(0)|答案(2)|浏览(114)

我 正在 开发 我 的 第 一 个 全 栈 应用 程序 , 特别 是 MERN 栈 , 并且 遇到 了 一 点 问题 。 我 正在 尝试 在 我 的 网站 上 为 Unity 游戏 实现 一 个 存储 在 数据 库 中 的 排行 榜 。 我 的 一切 工作 都 正常 , 其中 客户 端 可以 使用 我 的 Express API 从 我 的 MongoDB Atlas 数据 库 发布 和 获取 分数 。 然而 , 在 排行 榜 的 情况 下 ,我 需要 确保 分数 只能 由 客户 端 根据 游戏 的 进行 情况 发送 。 在 当前 的 工作 配置 下 , 任何 人 都 可以 通过 api 发送 欺骗 分数 , 而 不必 玩 游戏 。
我 首先 想到 的 是 尝试 实现 JWT 来 验证 来自 该 站点 的 API 调用 , 但 在 我 看来 , 任何 像 JWT 这样 的 auth 令牌 仍然 可以 被 用户 复制 下来 , 并 通过 Postman 轻松 地 发送 欺骗 的 分数 。
我 对 数据 库 并 不 十分 熟悉 , 我 怀疑 如果 我 不 使用 像 Atlas 这样 的 DBaaS 提供 商 , 这个 问题 可能 会 得到 解决 , 但 我 不 完全 确定 。
任何 想法 或 建议 将 不胜 感激 !

kmbjn2e3

kmbjn2e31#

您可以定义一个中间件函数并检查传入请求的方法:

const allowOnlyPost = (req, res, next) => {
    if (req.method !== 'POST') {
        return res.status(401).send(`Method ${req.method} not allowed`)
    }
    next()
}

module.exports = { allowOnlyPost }

然后将其应用于要保护的路由:

const { allowOnlyPost } = require('./your/middleware/folder')

app.use('/route/to/protect', allowOnlyPost, (req, res) => { ... })
gk7wooem

gk7wooem2#

对 当前 答案 功能 的 改进 可以 是 :

const allowMethods = (...methods) => { 
    return (req, res, next) => {
        if (!methods.map(m => m.toUpperCase()).includes(req.method.toUpperCase())) {
            return res.status(401).send(`Method ${req.method} not allowed`)
        }
        next()
    }
}
module.exports = { allowMethods }

中 的 每 一 个
因此 , 您 可以 这样 使用 它 :

const { allowMethods } = require('./your/middleware/folder')

app.use('/route/to/protect', allowMethods('get','post'), (req, res) => { ... })

格式

相关问题