【问题标题】:Confusion over session data being stored in a database being a violation of REST principles对存储在数据库中的会话数据的混淆违反了 REST 原则
【发布时间】:2020-05-02 21:25:53
【问题描述】:

我正在撰写一份关于我设计的应用程序的报告,其中包括我认为的后端的 REST API。

应用程序授权用户从数据库请求资源的方式是使用会话 cookie。我知道关于会话 cookie 服务器端是否违反 REST 存在很多争论,但我没有找到任何具体说明,说明我使用它们的方式违反了 REST 规则。

我正在使用带有express-session 包的节点Express 框架。创建和存储 cookie 的方式是通过中间件将会话数据保存到我的 mongodb 实例中,connect-mongodb-session 如下所示:

app.js

    // app.js imports start
    const mongoose = require("mongoose");
    const session = require("express-session");
    const config = require("config");
    const MongoDBStore = require("connect-mongodb-session")
    // app.js imports end

    const mdbStore = new MongoDBStore({
        uri: config.get("mongoURI"),
        mongooseConnection: mongoose.connection,
        collection: "sessions",
        ttl: config.get("sessionLife") / 1000,
    });

    // Session middleware
    app.use(
        session({
            name: config.get("sessionName"),
            genid: function () {
                return uuid.v4();
            },
            secret: config.get("sessionKey"),
            resave: false,
            saveUninitialized: false,
            cookie: {
                sameSite: true,
                httpOnly: true,
                maxAge: config.get("sessionLife"),
            },
            store: mdbStore,
        })
    );

这意味着当客户端请求进来时,客户端的授权数据将通过req.session 获得,但该数据来自我的数据库,而不是存储在任何地方的服务器上。

所以最终这意味着我的服务器不直接存储任何用户数据,而是依赖于存储在数据库中的会话 cookie 的状态。这是否意味着 API 不是 RESTful?

我通读了这篇 SO 文章,只发现了一小部分提到了存储在数据库中的 cookie Do sessions really violate RESTfulness?,但仍然非常感谢任何人的任何 cmets/澄清/批评。谢谢

【问题讨论】:

    标签: javascript node.js mongodb rest express


    【解决方案1】:

    它基于前端的性质

    如果您使用部署在公共商店中的移动应用程序,任何人都可以下载它并使用社交 ID 自动注册,那么您的技术不好

    通常对于企业移动应用程序,会话数据应加密并在请求响应中来回发送并在移动代码中维护

    如果这只是一个网页,并且 REST 也可以在部署 HTML 的同一服务器中使用,那么会话可以存储在 DB 中

    如果 REST 在另一台计算机中分离,并且您通过不公开的内部 ip/主机地址从前端服务器端代码调用它,那么您的逻辑不好

    前端服务器端代码 - 意味着您可以拥有一个专门的服务器来负责不包含数据库访问代码的 react js 执行 - 只有 AJAX 服务才会显然是 REST,可能会有另一台服务器再次接收另一个 REST 调用,该调用将与安装 MySQL 或 Oracle 的另一台计算机通信

    表示 1 个 Web 服务器、1 个应用服务器和 1 个数据库服务器 - 类似于现实世界的企业应用程序

    如果您的数据库未在同一台计算机上配置,则将会话存储在数据库中不是一个好主意,请在第一台计算机上创建一个缓存数据库服务器,如 rediscouchbase 并将会话存储在那里,离开业务单独的 DB 与您的 UI 逻辑和需求分开

    【讨论】:

    • 前端是一个 React/Redux 构建与create-react-app,目前与移动无关。你能澄清最后一部分吗?前端服务器端代码是什么意思?
    • 所以是的,这基本上是配置。 react js 执行使用axios 与查询云数据库(mongodb)的 REST API 对话。那么你对我的所作所为有什么结论吗?我仍然不确定您是否说我的实施不好?
    • 是的,如果您的数据库未配置在同一台计算机上,那么将会话存储在数据库中不是一个好主意,请在第一台计算机上创建一个缓存数据库服务器(如 redis 或 couchbase)并将会话存储在那里,将业务数据库与您的 UI 逻辑和需求分开
    猜你喜欢
    • 2019-08-30
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 2020-11-21
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多