#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();
});