ПО промежуточного слоя сеанса 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 может привести к проблемам если секрет не совпадает между этим модулем и

анализатор файлов cookie .

Предупреждение Хранилище сеансов на стороне сервера по умолчанию, MemoryStore , намеренно имеет номер . не предназначен для производственной среды. Это приведет к утечке памяти под большинством условиях, не масштабируется за пределы одного процесса и предназначен для отладки и развивающийся.

Список хранилищ см. в разделе совместимые хранилища сеансов.

Параметры

экспресс-сеанс принимает эти свойства в объекте параметров.

cookie

Объект настроек для файла cookie идентификатора сеанса. Значение по умолчанию {путь: '/', httpOnly: true, secure: false, maxAge: null } .

В этом объекте можно установить следующие параметры.

cookie.domain

Указывает значение атрибута Домен Set-Cookie . По умолчанию без домена установлен, и большинство клиентов будут считать, что файл cookie применяется только к текущему домен.

cookie.expires

Определяет объект Date как значение атрибута Expires Set-Cookie . По умолчанию срок действия не установлен, и большинство клиентов считают это «непостоянный файл cookie» и удалит его при таком условии, как выход из веб-браузера. приложение.

Примечание Если в опциях установлены оба expires и

maxAge , то последний определенное в объекте, это то, что используется.

Примечание Параметр expires не следует задавать напрямую; вместо этого используйте только maxAge вариант.

cookie.httpOnly

Указывает логическое значение для атрибута HttpOnly Set-Cookie . Когда правдиво, установлен атрибут HttpOnly , в противном случае это не так. По умолчанию HttpOnly установлен атрибут.

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

документ. 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 , в противном случае — нет. По умолчанию Secure атрибут не задан.

Примечание будьте осторожны при установке этого параметра на true , так как совместимые клиенты не будут отправлять куки обратно на сервер в будущем, если в браузере нет HTTPS связь.

Обратите внимание, что secure: true — это рекомендуемый вариант для . Однако он требует веб-сайт с поддержкой https, т. е. HTTPS необходим для безопасных файлов cookie. Если безопасный установлен, и вы получаете доступ к своему сайту через HTTP, файл cookie не будет установлен. Если вы если ваш node.js находится за прокси-сервером и вы используете

secure: true , вам нужно установить «доверительный прокси» в экспрессе:

 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.

Этот полезно, когда параметр Express «доверенный прокси-сервер» правильно настроен для упрощения разработка по сравнению с производственной конфигурацией.

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: событие не найдено
  • -баш:
  • баш:
  • событие не найдено

Совершенно уверен, что я только что получил очень болезненный урок, но попробовать стоит.

Кто может помочь с:

  1. Что делает bash с неустановленной переменной, если вы пытаетесь ее использовать?
  2. Как сценарий обрабатывает неустановленную переменную?
  3. Что еще можно попробовать вместо пароля?
  4. Есть ли код пробела ASCII/UTF, который я могу попробовать вместо пароля?
  • командная строка
  • bash
  • сценарии
  • переменные окружения

3

Стоит отметить несколько замечаний.

  1. «… фраза-пароль gpg (устанавливается скриптом)». Я так понимаю, вы не писали сценарий. Пожалуйста, опубликуйте сценарий. Есть ли инструкция по его использованию?
  2. фраза-пароль="мой!пароль" . Это не означает «использовать! как часть строки». !pass означает «прочитать историю и получить последнюю команду, начинающуюся с pass «. Если в истории нет команд, начинающихся с pass , ошибка bash: !pass: событие не найдено возникает, как вы попадаете в командную строку. Вот почему я предполагаю, что вы не написали сценарий. Он задуман для случая, когда в истории есть какая-то команда, начинающаяся с pass .
  3. «При настройке через TTY (и я думаю, вы выполнили passphrase="my!pass" ) , bash жалуется … Когда я повторяю переменную, она не установлена». Как было сказано выше, возникает ошибка. Но происходит еще две вещи: 1) Команда не выполняется. То есть вы даже не получаете «мой» (вы могли ожидать получить «мой» = «мой» + пустая строка) в качестве значения парольная фраза , она остается неустановленной.