ПО промежуточного слоя сеанса Express
Примечание: Эта страница создана на основе сеанс README.
Установка
Это модуль Node.js, доступный через
реестр нпм. Установка производится с помощью npm install
command:
$ npm install express-session
API
var session = require('express-session')
сеанс (параметры)
Создать промежуточное программное обеспечение сеанса с заданными опции
.
Примечание Данные сеанса — это , а не , сохраненные в самом файле cookie, только идентификатор сеанса. Данные сеанса хранятся на стороне сервера.
Примечание Начиная с версии 1.5.0 промежуточное ПО cookie-parser
больше не нужно использовать этот модуль для работы. Этот модуль теперь напрямую читает
и записывает куки на req
/ req
. Использование cookie-parser
может привести к проблемам
если секрет
не совпадает между этим модулем и
.
Предупреждение Хранилище сеансов на стороне сервера по умолчанию, MemoryStore
, намеренно имеет номер .
не предназначен для производственной среды. Это приведет к утечке памяти под большинством
условиях, не масштабируется за пределы одного процесса и предназначен для отладки и
развивающийся.
Список хранилищ см. в разделе совместимые хранилища сеансов.
Параметры
экспресс-сеанс
принимает эти свойства в объекте параметров.
cookie
Объект настроек для файла cookie идентификатора сеанса. Значение по умолчанию {путь: '/', httpOnly: true, secure: false, maxAge: null }
.
В этом объекте можно установить следующие параметры.
cookie.domain
Указывает значение атрибута Домен
Set-Cookie
. По умолчанию без домена
установлен, и большинство клиентов будут считать, что файл cookie применяется только к текущему
домен.
cookie.expires
Определяет объект Date
как значение атрибута Expires
Set-Cookie
.
По умолчанию срок действия не установлен, и большинство клиентов считают это
«непостоянный файл cookie» и удалит его при таком условии, как выход из веб-браузера.
приложение.
Примечание Если в опциях установлены оба expires
и
, то последний
определенное в объекте, это то, что используется.
Примечание Параметр expires
не следует задавать напрямую; вместо этого используйте только maxAge
вариант.
cookie.httpOnly
Указывает логическое значение
для атрибута HttpOnly
Set-Cookie
. Когда правдиво,
установлен атрибут HttpOnly
, в противном случае это не так. По умолчанию HttpOnly
установлен атрибут.
Примечание будьте осторожны, устанавливая для этого параметра значение true
, так как совместимые клиенты не позволят
клиентский JavaScript, чтобы увидеть файл cookie в
.
cookie.maxAge
Задает число
(в миллисекундах), используемое при расчете Expires
Атрибут Set-Cookie
. Это делается путем взятия текущего времени сервера и добавления maxAge
миллисекунд к значению для расчета даты и времени Expires
. По умолчанию,
максимальный возраст не установлен.
Примечание Если в опциях установлены оба expires
и maxAge
cookie.path
Задает значение для Path
Set-Cookie
. По умолчанию установлено значение '/'
, что
это корневой путь домена.
cookie.sameSite
Задает логическое значение
или строку
в качестве значения атрибута SameSite
Set-Cookie
.
По умолчанию это false
.
-
true
установит для атрибутаSameSite
значениеStrict
для строгого соблюдения правил на одном и том же сайте. -
false
не будет устанавливать атрибутSameSite
. -
'lax'
установит для атрибутаSameSite
значениеLax
для слабого применения того же сайта. -
'none'
установит для атрибутаSameSite
значениеNone
для явного межсайтового файла cookie. -
'strict'
установит для атрибутаSameSite
значениеStrict
для строгого соблюдения правил сайта.
Дополнительную информацию о различных уровнях контроля можно найти в спецификация.
Примечание Этот атрибут еще не полностью стандартизирован и может измениться в будущем. будущее. Это также означает, что многие клиенты могут игнорировать этот атрибут, пока не поймут его.
Примечание Имеется черновая спецификация
для этого требуется, чтобы атрибут Secure
был установлен на true
, когда Атрибут SameSite
был
установить на 'нет'
. Некоторые веб-браузеры или другие клиенты могут использовать эту спецификацию.
cookie.secure
Указывает логическое значение
для атрибута Secure
Set-Cookie
. Когда правдиво,
установлен атрибут
, в противном случае — нет. По умолчанию Secure
атрибут не задан.
Примечание будьте осторожны при установке этого параметра на true
, так как совместимые клиенты не будут отправлять
куки обратно на сервер в будущем, если в браузере нет HTTPS
связь.
Обратите внимание, что secure: true
— это рекомендуемый вариант для . Однако он требует
веб-сайт с поддержкой https, т. е. HTTPS необходим для безопасных файлов cookie. Если безопасный
установлен, и вы получаете доступ к своему сайту через HTTP, файл cookie не будет установлен. Если вы
если ваш node.js находится за прокси-сервером и вы используете
, вам нужно установить
«доверительный прокси» в экспрессе:
var app = express() app. set('доверять прокси', 1) // доверять первому прокси app.use (сеанс ({ секрет: 'клавиатурный кот', пересохранить: ложь, saveUninitialized: правда, куки: { безопасный: правда } }))
Для использования безопасных файлов cookie в производстве, но с возможностью тестирования в процессе разработки,
ниже приведен пример включения этой настройки на основе NODE_ENV
в экспрессе:
var app = express() вар сесс = { секрет: 'клавиатурный кот', куки: {} } если (app.get('env') === 'производство') { app.set('доверять прокси', 1) // доверять первому прокси sess.cookie.secure = true // обслуживать безопасные файлы cookie } app.use (сессия (сессия))
Для параметра cookie.secure
также можно установить специальное значение 'авто'
иметь
этот параметр автоматически соответствует установленной безопасности соединения. Быть
будьте осторожны при использовании этого параметра, если сайт доступен как по HTTP, так и по HTTPS,
как только файл cookie будет установлен на HTTPS, он больше не будет виден по HTTP.
«доверенный прокси-сервер»
правильно настроен для упрощения
разработка по сравнению с производственной конфигурацией.genid
Функция для вызова для создания нового идентификатора сеанса. Предоставьте функцию, которая возвращает
строка, которая будет использоваться в качестве идентификатора сеанса. Функция задана требуется
как
первый аргумент, если вы хотите использовать какое-то значение, прикрепленное к req
при генерации
идентификатор.
Значение по умолчанию — это функция, которая использует библиотеку uid-safe
для создания идентификаторов.
ПРИМЕЧАНИЕ будьте осторожны при создании уникальных идентификаторов, чтобы сеансы не конфликтовали.
app.use(сеанс({ genid: функция (требуется) { return genuuid() // использовать UUID для идентификаторов сеанса }, секрет: 'клавиатурный кот' }))
имя
Имя файла cookie идентификатора сеанса, который необходимо установить в ответе (и прочитать из запрос).
Значение по умолчанию: 'connect.sid'
.
Примечание , если у вас есть несколько приложений, работающих на одном хосте (это просто
имя, например localhost
127.0.0.1
; разные схемы и порты не
назовите другое имя хоста), тогда вам нужно отделить файлы cookie сеанса от
друг друга. Самый простой способ — просто установить разные имена
для каждого приложения.прокси
Доверять обратному прокси при установке безопасных файлов cookie (через «X-Forwarded-Proto» заголовок).
Значение по умолчанию: undefined
.
-
true
Будет использоваться заголовок «X-Forwarded-Proto». -
false
Все заголовки игнорируются, и соединение считается только безопасным если есть прямое соединение TLS/SSL. -
не определено
Использует параметр «доверительный прокси» из экспресс
resave
Принудительное сохранение сеанса обратно в хранилище сеансов, даже если сеанс никогда не изменялся во время запроса. В зависимости от вашего магазина это может быть необходимо, но это также может создать условия гонки, когда клиент делает два параллельные запросы к вашему серверу и внесение изменений в сессию в одном запрос может быть перезаписан, когда другой запрос завершится, даже если он не сделал изменения (это поведение также зависит от того, какой магазин вы используете).
Значение по умолчанию: true
, но использование значения по умолчанию устарело,
так как значение по умолчанию изменится в будущем. Пожалуйста, изучите этот параметр
и выберите то, что подходит для вашего варианта использования. Как правило, вы хотите ложь
.
Как узнать, нужно ли это для моего магазина? Лучший способ узнать это
уточните в своем магазине, реализует ли он метод touch
. Если это так, то
можно смело ставить resave: false
. Если он не реализует коснуться
метод, и ваш магазин устанавливает дату истечения срока действия для сохраненных сеансов, тогда вы
скорее всего нужно пересохранить: true
.
скользящий
Принудительно устанавливать файл cookie идентификатора сеанса при каждом ответе. Срок действия
сбрасывается на исходный maxAge
, сбрасывая срок действия
обратный отсчет.
Значение по умолчанию: false
.
Если этот параметр включен, срок действия файла cookie идентификатора сеанса истекает через maxAge
с момента отправки последнего ответа вместо in maxAge
с момента последнего изменения сеанса сервером.
Обычно используется в сочетании с короткими, не относящимися к сеансу maxAge
значений для обеспечения быстрого тайм-аута данных сеанса
с уменьшенным потенциалом его возникновения во время текущих взаимодействий с сервером.
Примечание Если для этого параметра установлено значение true
, но параметр saveUninitialized
установлен
установлено значение false
, cookie не будет установлен на ответ с неинициализированным
сессия. Этот параметр изменяет поведение только тогда, когда существующий сеанс
загружается по запросу.
saveUninitialized
Принудительно сохраняет «неинициализированный» сеанс в хранилище. Сессия
неинициализируется, если он новый, но не изменен. Выбор false
полезен для
внедрение сеансов входа в систему, сокращение использования хранилища на сервере или соблюдение
законы, которые требуют разрешения перед установкой файла cookie. Выбор false
также
помочь с условиями гонки, когда клиент делает несколько параллельных запросов
без сеанса.
Значение по умолчанию true
, но использование значения по умолчанию устарело, так как
по умолчанию изменится в будущем. Пожалуйста, изучите этот параметр и
выберите то, что подходит для вашего варианта использования.
Примечание , если вы используете Session в сочетании с PassportJS, Passport добавит в сеанс пустой объект Passport для использования после того, как пользователь аутентифицировано, что будет рассматриваться как модификация сеанса, вызывающая его спасти. Это было исправлено в PassportJS 0.3.0
секрет
Обязательный параметр
Это секрет, используемый для подписи файла cookie идентификатора сеанса. Это может быть либо строка для одного секрета или массива из нескольких секретов. Если массив секретов при условии, что только первый элемент будет использоваться для подписи файла cookie идентификатора сеанса, в то время как все элементы будут учитываться при проверке подписи в запросах. секрет сам по себе не должен быть легко разобран человеком и лучше всего представлять собой случайный набор символов. Передовая практика может включать:
- Использование переменных среды для хранения секрета, обеспечение самого секрета не существует в вашем репозитории.
- Периодические обновления секрета с сохранением предыдущего секрета в множество.
Использование секрета, который невозможно угадать, снизит возможность захвата сеанса до
только угадывание идентификатора сеанса (как определено опцией genid
).
Изменение значения секрета приведет к аннулированию всех существующих сеансов. Для того, чтобы повернуть секрет без аннулирования сеансов, предоставить массив секретов с новым секрет как первый элемент массива и включая предыдущие секреты как более поздние элементы.
store
Экземпляр хранилища сеанса по умолчанию представляет собой новый экземпляр MemoryStore
.
снято с охраны
Управление результатом снятия с охраны req.session
(через удалить
, установив значение null
,
и т. д.).
Значение по умолчанию: 'сохранить'
.
-
'destroy'
Сессия будет уничтожена (удалена) по завершении ответа. -
'сохранить'
Сессия в хранилище будет сохранена, но изменения, сделанные во время запрос игнорируется и не сохраняется.
req.session
Чтобы сохранить или получить доступ к данным сеанса, просто используйте свойство запроса req. session
,
который (обычно) сериализуется магазином как JSON, поэтому вложенные объекты
обычно в порядке. Например, ниже показан пользовательский счетчик просмотров:
// Использовать промежуточное программное обеспечение сеанса. app.use(session({secret: 'keyboard cat', cookie: {maxAge: 60000}})) // Доступ к сеансу как req.session app.get('/', function(req, res, next) { если (req.session.views) { req.session.views++ res.setHeader('Тип содержимого', 'текст/html') res.write('просмотры: ' + req.session.views + '
') res.write('срок действия истекает через: ' + (req.session.cookie.maxAge / 1000) + 's
') Отправить() } еще { req.session.views = 1 res.end('добро пожаловать в демонстрацию сеанса. Обновите!') } })
Session.regenerate(callback)
Для повторного создания сеанса просто вызовите метод. После завершения
новый SID и экземпляр Session
будут инициализированы по адресу req.session
. и будет вызван обратный вызов
.
req.session.regenerate (функция (ошибка) { // здесь будет новая сессия })
Session.destroy(callback)
Уничтожает сеанс и сбрасывает свойство req.session
.
После завершения 9Будет вызван обратный вызов 0012 .
req.session.destroy (функция (ошибка) { // здесь нет доступа к сеансу })
Session.reload(callback)
Перезагружает данные сеанса из хранилища и повторно заполняет объект req.session
. После завершения будет вызван обратный вызов
.
req.session.reload (функция (ошибка) { // сессия обновлена })
Session.save(callback)
Сохраните сеанс обратно в хранилище, заменив содержимое хранилища на содержимое в памяти (хотя магазин может делать что-то еще — проконсультируйтесь с магазином документацию для точного поведения).
Этот метод автоматически вызывается в конце ответа HTTP, если данные сеанса были изменены (хотя это поведение можно изменить с помощью различных параметры в конструкторе промежуточного программного обеспечения). Из-за этого, как правило, этот метод не нужно вызывать.
В некоторых случаях полезно вызвать этот метод, например, перенаправления, долгоживущие запросы или в WebSockets.
req.session.save (функция (ошибка) { // сессия сохранена })
Session.touch()
Обновляет свойство .maxAge
. Обычно это
нет необходимости вызывать, так как промежуточное программное обеспечение сеанса делает это за вас.
req.session.id
Каждый сеанс имеет связанный с ним уникальный идентификатор. Это свойство является
псевдоним req.sessionID
и не может быть изменен.
Он был добавлен, чтобы сделать идентификатор сеанса доступным из сеанса
.
объект.
req.session.cookie
Каждый сеанс сопровождается уникальным объектом cookie. Это позволяет
вам изменить файл cookie сеанса для каждого посетителя. Например, мы можем
набор req.session.cookie.expires от
до false
для включения файла cookie
оставаться только на время действия пользовательского агента.
Cookie.maxAge
В качестве альтернативы req.session.cookie.maxAge
вернет время
оставшееся в миллисекундах, которое мы также можем повторно присвоить новому значению
чтобы соответствующим образом настроить свойство .expires
. Следующее
по существу эквивалентны
вар час = 3600000 req.session.cookie.expires = новая дата (Date.now() + час) req.session.cookie.maxAge = час
Например, если для maxAge
установлено значение 60000
(одна минута) и 30 секунд.
истекло, он будет возвращать 30000
, пока текущий запрос не будет завершен,
в это время req.session.touch()
вызывается для сброса req.session.cookie.maxAge
к исходному значению.
req.session.cookie.maxAge // => 30000
Cookie.originalMaxAge
Свойство req.session.cookie.originalMaxAge
возвращает оригинал maxAge
(время жизни) файла cookie сеанса в миллисекундах.
req.sessionID
Чтобы получить идентификатор загруженного сеанса, откройте свойство запроса req.sessionID
. Это просто значение, доступное только для чтения, которое устанавливается, когда сеанс
загружается/создается.
Реализация хранилища сеансов
Каждое хранилище сеансов должно быть EventEmitter
и специфичным для реализации
методы. Следующие методы являются списком необходимых , рекомендуется ,
и опционально .
- Обязательные методы — это те, которые этот модуль всегда будет вызывать в хранилище.
- Рекомендуемые методы — это те, которые этот модуль будет вызывать в хранилище, если доступный.
- Необязательные методы — это те, которые этот модуль вообще не вызывает, но помогает презентовать единообразные магазины пользователям.
Для примера реализации просмотрите репозиторий connect-redis.
store.all(обратный вызов)
Дополнительно
Этот необязательный метод используется для получения всех сеансов в хранилище в виде массива. Обратный вызов
должен вызываться как обратный вызов (ошибка, сеансы)
.
store.destroy(sid, callback)
Обязательный
Этот обязательный метод используется для уничтожения/удаления сеанса из заданного хранилища
идентификатор сеанса ( sid
). Обратный вызов
должен вызываться как обратный вызов (ошибка)
один раз
сессия уничтожена.
store.clear(callback)
Необязательный
Этот необязательный метод используется для удаления всех сеансов из хранилища.
Обратный вызов
должен вызываться как обратный вызов (ошибка)
после очистки хранилища.
store.length(callback)
Необязательный
Этот необязательный метод используется для подсчета всех сеансов в хранилище.
Обратный вызов
следует вызывать как обратный вызов (ошибка, длина)
.
store.
get(сид, обратный вызов)Обязательный
Этот обязательный метод используется для получения сеанса из хранилища при заданном сеансе.
ID ( сид
). Обратный вызов
должен вызываться как обратный вызов (ошибка, сеанс)
.
Аргумент session
должен быть сеансом, если он найден, иначе null
или undefined
если сессия не найдена (и ошибки не было). Специальный
случай возникает, когда error.code === 'ENOENT'
действует как обратный вызов (ноль, ноль)
.
store.set(sid, session, callback)
Required
Этот обязательный метод используется для отправки сеанса в хранилище с учетом
идентификатор сеанса ( sid
) и объект сеанса ( session
). Обратный вызов должен быть
вызывается как обратный вызов (ошибка)
после того, как сеанс был установлен в магазине.
store.
touch(sid, session, callback)Рекомендуется
Этот рекомендуемый метод используется для
идентификатор сеанса ( sid
) и сеанс ( session
) объект. Обратный вызов
должен быть
вызывается как обратный вызов (ошибка)
после того, как сеанс был затронут.
В основном используется, когда магазин автоматически удаляет неиспользуемые сеансы. и этот метод используется, чтобы сообщить хранилищу, что данный сеанс активен, потенциально сброс таймера простоя.
Совместимые хранилища сеансов
Следующие модули реализуют хранилище сеансов, совместимое с этим модуль. Пожалуйста, сделайте PR для добавления дополнительных модулей 🙂
aerospike-session-store Магазин сеансов, использующий Aerospike.
better-sqlite3-session-store Хранилище сеансов, основанное на better-sqlite3.
cassandra-store Хранилище сеансов на основе Apache Cassandra.
cluster-store Обертка для использования в процессе/встроенном хранилища — такие как SQLite (через knex), leveldb, файлы или память — с кластером узлов (желательно для Raspberry Pi 2 и другие многоядерные встраиваемые устройства).
connect-arango Хранилище сеансов на основе ArangoDB.
connect-azuretables Хранилище сеансов на основе хранилища таблиц Azure.
connect-cloudant-store Хранилище сеансов на основе IBM Cloudant.
connect-couchbase Хранилище сеансов на основе дивана.
connect-datacache Хранилище сеансов на основе IBM Bluemix Data Cache.
@google-cloud/connect-datastore Хранилище сеансов на основе Google Cloud Datastore.
connect-db2 Хранилище сеансов на основе IBM DB2, созданное с использованием модуля ibm_db.
connect-dynamodb Хранилище сеансов на основе DynamoDB.
@google-cloud/connect-firestore Хранилище сеансов на основе Google Cloud Firestore.
connect-hazelcast Хранилище сеансов Hazelcast для Connect и Express.
connect-loki Хранилище сеансов на основе Loki.js.
connect-lowdb Хранилище сеансов на базе lowdb.
connect-memcached Хранилище сеансов на основе memcached.
connect-memjs Хранилище сеансов на основе memcached, использующее memjs в качестве клиента memcached.
connect-ml Хранилище сеансов на основе сервера MarkLogic.
connect-monetdb Хранилище сеансов на основе MonetDB.
connect-mongo Хранилище сеансов на основе MongoDB.
connect-mongodb-session Облегченное хранилище сеансов на основе MongoDB, созданное и поддерживаемое MongoDB.
connect-mssql-v2 Хранилище сеансов на основе Microsoft SQL Server, основанное на connect-mssql.
connect-neo4j Хранилище сеансов на основе Neo4j.
connect-pg-simple Хранилище сеансов на основе PostgreSQL.
connect-redis Хранилище сеансов на основе Redis.
connect-session-firebase Хранилище сеансов на основе базы данных реального времени Firebase
connect-session-knex Хранилище сеансов, использующее Knex.js — построитель SQL-запросов для PostgreSQL, MySQL, MariaDB, SQLite3 и Oracle.
connect-session-sequelize Хранилище сеансов с использованием Sequelize.js, который представляет собой ORM Node.js/io.js для PostgreSQL, MySQL, SQLite и MSSQL.
connect-sqlite3 Хранилище сеансов SQLite3, созданное по образцу хранилища TJ connect-redis
.
connect-typeorm Хранилище сеансов на основе TypeORM.
CouchDB-выражение Хранилище сеансов на основе CouchDB.
dynamodb-store Хранилище сеансов на базе DynamoDB.
express-etcd Хранилище сеансов на основе etcd.
express-mysql-session Хранилище сеансов с использованием собственного MySQL через модуль node-mysql.
express-nedb-session Хранилище сеансов на основе NeDB.
express-oracle-session Хранилище сеансов с использованием собственного oracle через модуль node-oracledb.
экспресс-кеш-менеджер сеанса Магазин, в котором реализован кеш-менеджер, поддерживающий разнообразие типов хранения.
express-session-etcd3 Хранилище сеансов на основе etcd3.
экспресс-уровень сеанса Хранилище сеансов на основе LevelDB.
express-session-rsdb Хранилище сеансов на основе Rocket-Store: очень простая, сверхбыстрая и в то же время мощная база данных с плоскими файлами.
express-sessions Хранилище сеансов, поддерживающее как MongoDB, так и Redis.
firestore-store Хранилище сеансов на базе Firestore.
сеанс удачи A Fortune.js хранилище сеансов. Поддерживает все серверные части, поддерживаемые Fortune (MongoDB, Redis, Postgres, NeDB).
hazelcast-store Хранилище сеансов на основе Hazelcast, созданное на клиенте узла Hazelcast.
level-session-store Хранилище сеансов на основе LevelDB.
lowdb-session-store Хранилище сеансов на основе lowdb.
medea-session-store Хранилище сеансов на основе Medea.
memorystore Хранилище сеансов памяти, предназначенное для производства.
mssql-session-store Хранилище сеансов на базе SQL Server.
nedb-session-store Альтернативное хранилище сеансов на основе NeDB (либо в памяти, либо в файле).
@quixo3/prisma-session-store Хранилище сеансов для Prisma Framework.
restsession Сохранение сеансов с использованием RESTful API
sequencestore-connect Сохранение сеансов с использованием Sequelize. js.
session-file-store Хранилище сеансов на основе файловой системы.
session-pouchdb-store Хранилище сеансов для PouchDB/CouchDB. Принимает встроенный, пользовательский или удаленный экземпляр PouchDB и синхронизацию в реальном времени.
session-rethinkdb Хранилище сеансов на основе RethinkDB.
@databunker/session-store Зашифрованное хранилище сеансов на основе Databunker.
sessionstore Хранилище сеансов, которое работает с различными базами данных.
tch-nedb-session Хранилище сеансов файловой системы на основе NeDB.
Примеры
Счетчик просмотров
Простой пример использования экспресс-сеанса
для хранения просмотров страниц для пользователя.
переменная экспресс = требуется('экспресс') вар парсерл = требуется('парсерл') var session = require('экспресс-сеанс') вар приложение = экспресс() app.use (сеанс ({ секрет: 'клавиатурный кот', пересохранить: ложь, saveUninitialized: правда })) app. use (функция (req, res, next) { если (!req.session.views) { req.session.views = {} } // получаем URL-адрес пути var pathname = parseurl(req).pathname // считаем просмотры req.session.views[путь] = (req.session.views[путь] || 0) + 1 следующий() }) app.get('/foo', function (req, res, next) { res.send('вы просматривали эту страницу' + req.session.views['/foo'] + 'раз') }) app.get('/bar', function (req, res, next) { res.send('вы просматривали эту страницу' + req.session.views['/bar'] + 'раз') }) app.listen(3000)
Логин пользователя
Простой пример использования экспресс-сеанса
для сохранения входа пользователя в сеанс.
var escapeHtml = требуется ('escape-html') var экспресс = требуется('экспресс') var session = require('экспресс-сеанс') вар приложение = экспресс() app.use (сеанс ({ секрет: 'клавиатурный кот', пересохранить: ложь, saveUninitialized: правда })) // промежуточное ПО для проверки подлинности функция isAuthenticated (req, res, next) { если (req. session.user) следующий() иначе следующий('маршрут') } app.get('/', isAuthenticated, function (req, res) { // это вызывается только тогда, когда есть пользователь аутентификации из-за isAuthenticated res.send('привет,' + escapeHtml(req.session.user) + '!' + ' Выйти') }) app.get('/', function (req, res) { res.send('') }) app.post('/login', express.urlencoded({extended: false}), function (req, res) { // логика входа для проверки req.body.user и req.body.pass // будет реализовано здесь. для этого примера подойдет любая комбинация // повторно сгенерировать сеанс, что является хорошей практикой, чтобы помочь // защита от форм фиксации сеанса req.session.regenerate (функция (ошибка) { если (ошибка) следующий (ошибка) // сохраняем информацию о пользователе в сеансе, обычно идентификатор пользователя req. session.user = req.body.user // сохраняем сессию перед перенаправлением, чтобы убедиться, что страница // загрузка не происходит до сохранения сессии req.session.save (функция (ошибка) { если (ошибка) вернуть следующий (ошибка) res.redirect('/') }) }) }) app.get('/выход из системы', function (req, res, next) { // логика выхода // удалить пользователя из объекта сеанса и сохранить. // это гарантирует повторное использование старого идентификатора сеанса // нет зарегистрированного пользователя req.session.user = ноль req.session.save (функция (ошибка) { если (ошибка) следующий (ошибка) // повторно сгенерировать сеанс, что является хорошей практикой, чтобы помочь // защита от форм фиксации сеанса req.session.regenerate (функция (ошибка) { если (ошибка) следующий (ошибка) res.redirect('/') }) }) }) app.listen(3000)
Отладка
Этот модуль использует модуль отладки внутренне для регистрации информации об операциях сеанса.
Чтобы просмотреть все внутренние журналы, установите для переменной среды DEBUG
значение экспресс-сеанс
при запуске приложения ( npm start
, в этом примере):
$ DEBUG=express-session npm start
В Windows используйте соответствующую команду;
> установить DEBUG = экспресс-сеанс и запуск npm
Лицензия
MIT
командная строка — расшифровка GPG: неверный ключ сеанса / переменная не установлена / восклицательный знак
Задавать вопрос
спросил
Изменено 1 год, 7 месяцев назад
Просмотрено 522 раза
Я пытаюсь расшифровать файл gpg, но постоянно получаю следующую ошибку:
gpg: ошибка расшифровки: неверный ключ сеанса
Позже я понял, что парольная фраза gpg (которая устанавливается скриптом) содержит восклицательный знак
фраза-пароль=»мой!пароль»
При настройке через TTY bash жалуется
-bash: !pass: событие не найдено
Когда я повторяю переменную, она не устанавливается.
пользователь@хост:~$ эхо $фраза-пароль пользователь@хост:~$
Итак, переменная неизвестна, и я предполагаю, что именно поэтому я не могу расшифровать свой файл.
Я пробовал в качестве пароля:
- my!pass
- мой
- !пройти
- ‘мой! пропуск’
- -bash: !pass: событие не найдено
- bash: !pass: событие не найдено
- -баш:
- баш:
- событие не найдено
Совершенно уверен, что я только что получил очень болезненный урок, но попробовать стоит.
Кто может помочь с:
- Что делает bash с неустановленной переменной, если вы пытаетесь ее использовать?
- Как сценарий обрабатывает неустановленную переменную?
- Что еще можно попробовать вместо пароля?
- Есть ли код пробела ASCII/UTF, который я могу попробовать вместо пароля?
- командная строка
- bash
- сценарии
- переменные окружения
3
Стоит отметить несколько замечаний.
- «… фраза-пароль gpg (устанавливается скриптом)». Я так понимаю, вы не писали сценарий. Пожалуйста, опубликуйте сценарий. Есть ли инструкция по его использованию?
-
фраза-пароль="мой!пароль"
. Это не означает «использовать! как часть строки».!pass
означает «прочитать историю и получить последнюю команду, начинающуюся сpass
«. Если в истории нет команд, начинающихся сpass
, ошибкаbash: !pass: событие не найдено
возникает, как вы попадаете в командную строку. Вот почему я предполагаю, что вы не написали сценарий. Он задуман для случая, когда в истории есть какая-то команда, начинающаяся сpass
. - «При настройке через TTY (и я думаю, вы выполнили
passphrase="my!pass"
) , bash жалуется … Когда я повторяю переменную, она не установлена». Как было сказано выше, возникает ошибка. Но происходит еще две вещи: 1) Команда не выполняется. То есть вы даже не получаете «мой» (вы могли ожидать получить «мой» = «мой» + пустая строка) в качестве значенияпарольная фраза
, она остается неустановленной.