【问题标题】:express-session - is it possible to change the secret while the node app is running?express-session - 是否可以在节点应用程序运行时更改秘密?
【发布时间】:2022-11-09 01:51:16
【问题描述】:

通常secret 在使用express-session 的节点应用程序中是硬编码的,例如 -

const session = require("express-session")
let RedisStore = require("connect-redis")(session)
const { createClient } = require("redis")
let redisClient = createClient({ legacyMode: true })
redisClient.connect().catch(console.error)
app.use(
  session({
    store: new RedisStore({ client: redisClient }),
    saveUninitialized: false,
    secret: "keyboard cat",
    resave: false,
  })
)

显然我可以通过编辑源代码和restarting 节点脚本来更改这个秘密keyboard cat。可以在应用程序仍在运行时更改它吗?

【问题讨论】:

  • 您尝试更改秘密的频率如何?您更改秘密的动机是什么?另外,您通常多久重新启动一次服务器以进行维护或清理内存并重新开始?
  • @jfriend00 我的动机是我将大部分代码放在 github 上,我不喜欢硬编码任何密码或秘密。我创建了一个 HTML 表单以允许管理员POST 秘密,但我认为这种方法失败了,因为包括会话的中间件已经加载但服务器接收秘密的时间(通过路由器 app.post('/login', (req, res) => { ...
  • 通常,您将某些未检入 github 的配置/部署文件的秘密部分。这与您放置服务器所需的数据库密码和其他凭据的配置文件类型相同。这样,当您的服务器启动时,它会从未存储在 github 中的本地配置文件中获取所需的凭据/秘密。
  • @jfriend00 这是我的第一种方法,但我的 Heroku 开发服务器的文件系统是 ephemeral,所以我的配置文件经常丢失。
  • 既然您提到了 Heroku,请参阅我在下面的答案末尾添加的内容。

标签: node.js express express-session


【解决方案1】:

根据here 的指导方针,可以通过传递一组秘密而不是单个秘密来更改会话秘密,然后您可以secrets.unshift(newSecret) 将新秘密放入数组中的第一个位置,同时继续接受使用了数组中的其他秘密。

所以,在你的代码中,你会这样做:

const session = require("express-session")
let RedisStore = require("connect-redis")(session)
const { createClient } = require("redis")
let redisClient = createClient({ legacyMode: true })
redisClient.connect().catch(console.error);
const secrets = ["keyboard cat"];

app.use(
  session({
    store: new RedisStore({ client: redisClient }),
    saveUninitialized: false,
    secret: secrets,
    resave: false,
  })
);

然后,稍后在您的代码中,您可以像这样更新当前使用的密钥:

secrets.unshift("my new secreet");

会话中间件将始终使用数组开头的密钥用于新会话,但将继续接受使用数组中其他密钥的 cookie。

我的动机是我将大部分代码放在 github 上,并且我不喜欢硬编码任何密码或秘密。

如果这是您的动机,那么通常您会将会话保密部分作为某些配置/部署文件的一部分,该文件未检入 github 并单独管理。这与您放置服务器所需的数据库密码和其他凭据的配置文件类型相同。这样,当您的服务器启动时,它会从未存储在 github 中的本地配置文件中获取所需的凭据/秘密。

然后,您也不必尝试动态更改正在运行的会话中间件密码。


既然您提到了 Heroku,以下是 Heroku 提到的用于管理配置变量的技术:

https://devcenter.heroku.com/articles/config-vars

【讨论】:

  • AFAIK 有记录的方法可以在不重新启动的情况下更改秘密:github.com/expressjs/session#secret 例如使用一个秘密数组,并不时将一个新秘密作为第一个元素推到数组中。这是OP要求的吗?
  • @LucioCrusca - 我根据该信息更新了我的答案。
猜你喜欢
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
相关资源
最近更新 更多