Как создать файл cookie с помощью node cookie-session

#node.js #express #cookie-session

#node.js #экспресс #cookie-сессия

Вопрос:

Я запускаю небольшое приложение узла. И я пытаюсь заставить его создавать файл cookie для каждого посетителя, называемый «session», который содержит, например, идентификатор сеанса. Но, похоже, я не могу заставить узел создавать файл cookie через cookie-session. Мой код до сих пор:

 const fs = require('fs');
const http = require('http');
const https = require('https');
const privateKey = fs.readFileSync('PATHTOKEY');
const certificate = fs.readFileSync('PATHTOKEY');
const credentials = {key: privateKey, cert: certificate};
const Keygrip = require("keygrip");    

const express = require('express');
const app = express();    

const port = APORTNUMBER;
const secureport = APORTNUMBER;
const helmet = require('helmet');    

const options = {
  dotfiles: 'deny',
  etag: true,
  extensions: ['html', 'htm'],
  index: 'index.html',
  lastModified: true,
  maxAge: 0,
  redirect: true,
  setHeaders: function (res, path, stat) {
    res.set('x-timestamp', Date.now())
  }
};    

app.use(express.static('public', options), helmet());    
 

Пока никаких проблем. Но затем появляется промежуточный файл cookie-session.

 const session = require('cookie-session');
const expiryDate = new Date(Date.now()   60 * 60 * 1000); // 1 hour    

app.use( 
  session({
    name: 'session',
    keys: new Keygrip(["MYSECRET1", "MYSECRET2"]),
    cookie: {
      secure: true,
      httpOnly: true,
      expires: expiryDate
    }
  })
);    
 

Выше я указал промежуточное программное обеспечение для использования этих параметров сеанса cookie, но как мне действовать дальше, чтобы заставить его создать этот файл cookie?

 const httpServer = http.createServer(app);
const httpsServer = https.createServer(credentials, app);    

httpServer.listen(port);
httpsServer.listen(secureport);    

console.log("Node server started");
 

Ответ №1:

Что ж, попробовав это сам, мне удается успешно использовать cookie-session промежуточное программное обеспечение. ура

Я использую промежуточное программное обеспечение следующим образом:

 app.use(cookieSession({
  name: 'session', // replace this with your own name to suit your needs
  keys: [ 'your-secret-key-goes-here', 'your-secret-key-goes-here' ]
})
 

О повторяющихся значениях в keys опции — в документах и связанных примерах всегда используются 2 разных ключа, несмотря @types на то, что библиотека TypeScript заявляет, что

Список ключей, которые нужно использовать для подписи и проверки значений файлов cookie. Установленные файлы cookie всегда подписываются ключами [0], в то время как другие ключи действительны для проверки, что позволяет поворачивать ключи.

Итак .. я использовал только один ключ.. дважды… и он работает как исключенный

Обратите внимание, что я использую это промежуточное программное обеспечение перед регистрацией экспресс app -маршрутов, чтобы это промежуточное программное обеспечение вступило в силу до запуска маршрутизатора (по запросу)

В каждом из моих маршрутов я могу использовать промежуточное программное обеспечение, используя что-то вроде этого

 app.get('/test', (req, res) => {
  req.session.test = { a: 5, b: 7} // yes - JSON payload are valid :)
})
 

Для проверки — убедитесь, что ваш первоначальный запрос получил следующие заголовки

 Set-Cookie: session=eyJ0ZXN0Ijp7ImEiOjUsImIiOjd9fQ==; path=/; secure; httponly
Set-Cookie: session.sig=D4VVF4XSbBEWXI4b04ZvybAxppw; path=/; secure; httponly
 

Это только пример, в котором session это имя файла cookie, как я определил ранее. Приветствия

Ответ №2:

Ваш текущий код выглядит правильно, также на основе документации @ http://expressjs.com/en/resources/middleware/cookie-session.html

Я бы предложил определить app.get и протестировать все с помощью такого инструмента, как postman или fidler.

например

 app.get('/test', function (req, res, next) {
  // Update views
  req.session.views = (req.session.views || 0)   1

  // Write response
  res.end(req.session.views   ' views')
})
 

Комментарии:

1. Я попробовал ваше предложение, но оно не создавало никаких видимых файлов cookie при посещении моего приложения через браузер.

Ответ №3:

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

зависимость:

 const cookieParser = require('cookie-parser');
 

конфигурация:

 const cookieConfig = {
  httpOnly: true,
  secure: true,
  maxAge: 1800,
  signed: true
};
 

Экспресс:

 app.use(cookieParser('MYSECRET'));    

app.use(function (req, res, next) {
  let cookie = req.cookies.cookieName;
  if (cookie === undefined) {
    let randomNumber=LOGICFORRANDOMNUMBER
    res.cookie('COOKIENAME', randomNumber, cookieConfig);
  };
  next();
});