рендеринг на стороне сервера без JavaScript-кода на стороне клиента - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь создать приложение, которое может публиковать данные как через ajax, так и через традиционные запросы форм.Я удивлен отсутствием информации, которую я нахожу в Интернете по этой теме.Полагаю, в наши дни мы все предполагаем, что у нас есть доступ к JS на стороне клиента?

Я пошел с экспресс-сессией, но разочарован тем, насколько сложно определить, что на самом деле происходит.Из того, что я могу понять, это кеширование данных cookie на клиенте и автоматическое включение их в запросы?Тогда можно ли предположить, что этот формат НЕ будет работать без поддержки javascript на стороне клиента?

При такой форме:

<form method="post" action="/create">
    <input name="value1" onChange={this.handleInput} value={this.state.value1} />
    <button onClick={this.submitForm}
</form>

Мои запросы, отправленные через ajax, будут проходить аутентификацию (из-зачтобы иметь данные сеанса):

event.preventDefault();
    postUrl(`/create`, {value1: this.state.value1})
    .then(jsonRes => {
       // works
});

выбирается промежуточным программным обеспечением, использующим экспресс-сеанс и паспорт:

module.exports.secured = (loginUrl = "/employers") => {
    return (req, res, next) => {
        if ( (req.isAuthenticated()) ) { return next(); }
        req.session.returnTo = req.originalUrl;
        res.redirect(loginUrl);
        return next();
    };
};

, которые защищают довольно простой маршрут API для создания:

router.post('/create', secured(), (req, res) => {

Я думаю, что даже если JS включен, я мог бы обработать запрос на этом маршруте, но проблема заключается в аутентификации.

Что я могу сделать, чтобы мои данные сеанса пересылались вэти запросы не-js?

Я помню, что в традиционных веб-стеках, таких как Rails или PHP, какой-то токен выводится в форму в скрытом поле или в действии при рендеринге.Если это сработает, кто-нибудь знает, как получить «жизненно важные данные», так сказать, из экспресс-сеанса для отправки в качестве токена?Не возможно?

Просматривая req.cookies или req.session объекта req, который анализируется при рендеринге на сервере, я не вижу ничего, что было бы полезно для этого.

1 Ответ

0 голосов
/ 31 января 2019

Что я могу сделать, чтобы мои данные сеанса пересылались в этих «не-js» запросах?

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

Кто хранит куки?это не javascript, а браузер, поэтому, если вы используете curl или утилиту scrapper, ваши клиенты должны будут извлечь возвращенный файл cookie и включить его в последующие запросы

То, что вы упоминаете о токене в форме, не являетсядля аутентификации, но для подделка межсайтовых запросов , что означает, что, поскольку вы обслуживали токен (и каким-то образом хранили его на стороне сервера), вы принимаете только запрос на вход в систему, включая указанный токен (доказательство того, что кто-то перешел на страницу входа вашего сайта)чтобы другие веб-сайты или клиенты, которые не заходили на ваш логин, пытались выполнить POSTing (т. е. scrapper)

Кроме того, сеансы не обязательно означают аутентификацию, современные фреймворки, как правило, выдают сеанснезависимо от того, аутентифицирован ли

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