Путаница в данных сеанса, хранящихся в базе данных, является нарушением принципов REST - PullRequest
1 голос
/ 02 мая 2020

Я пишу отчет о разработанном мною приложении, которое включает в себя, по моему мнению, REST API на сервере.

Способ, которым приложение разрешает пользователям запрашивать ресурсы из базы данных, заключается в использовании файлов cookie сеанса. Я понимаю, что существует много споров о том, нарушают ли сеансовые куки-файлы на стороне сервера REST, но я не нашел каких-либо конкретных c разъяснений о том, что способ их использования нарушает правила REST.

Я используя структуру узла Express с пакетом express-session. Файлы 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, но эти данные поступают из моей базы данных, и нигде не хранятся на сервере.

Таким образом, в конечном итоге это означает, что мой сервер не хранит никаких пользовательских данных напрямую, но зависит от состояния сеанса повара ie, хранящегося в базе данных. Означает ли это, что API не является RESTful?

Я прочитал эту SO-статью и обнаружил лишь небольшое упоминание о файлах cookie, хранящихся в базе данных Действительно ли сеансы нарушают RESTfulness? , но все равно действительно ценим любые комментарии / разъяснения / критику, которые кто-либо имеет. Спасибо

1 Ответ

2 голосов
/ 02 мая 2020

это зависит от характера внешнего интерфейса

, если вы используете мобильное приложение, развернутое в общедоступном магазине c, где кто-либо загружает его, и автоматически регистрируетесь с использованием социального идентификатора, тогда ваша технология не годится

Обычно для мобильного приложения предприятия данные сеанса должны быть зашифрованы и отправлены взад и вперед в ответе на запрос и сохранены в мобильном коде

, если это просто веб-страница и REST также доступно на том же сервере, где развернут HTML, тогда сеанс может быть сохранен в БД

Если REST отделен на другом компьютере и вы вызываете его из кода на стороне внешнего сервера через внутренний адрес ip / host который не доступен для publi c, тогда ваши логики c не годятся

код переднего плана на стороне сервера - означает, что вы можете иметь выделенный сервер ответственный за реакцию js, который не содержит код доступа к базе данных - только сервис AJAX, который у него будет, что очевидно Либо REST, может быть другой сервер, который снова получит другой вызов REST, который будет общаться с другим компьютером, на котором установлен MySQL или Oracle

означает 1 веб-сервер, 1 сервер приложений и 1 сервер базы данных - как корпоративные приложения реального мира

если ваша БД не настроена на том же компьютере, то сохранение сессии в БД не является хорошей идеей, создайте сервер кеш-базы данных, такой как redis или couchbase, на первом компьютере и сохраните сеанс там, оставьте бизнес-БД в покое отдельно от вашего пользовательского интерфейса c и нужно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...