express-session - 是否可以在节点应用程序 运行 时更改机密?
express-session - is it possible to change the secret while the node app is running?
通常是secret is hard-coded in node apps which use 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
。可以在应用程序仍然存在时更改它 运行?
据我所知,没有记录在案的方法来更改 运行 组 express-session 中间件的秘密。我可以想到几种“破解”方法,这些方法可以进行足够的调试侦查以深入 express-session 代码中正确的私有数据结构,或者向 express-session 添加新方法来更改秘密或禁用原始会话中间件并安装一个带有新密钥的新会话中间件。
但是,这会破坏任何现有的活动会话(因为它们所基于的 cookie 是使用原始秘密加密的)所以这可能不是一个实际的选择。
My motivation is that I put most of my code on github and I prefer not to hard-code any passwords or secrets.
如果这是您的动机,那么通常,您会将某些 configuration/deployment 文件的会话保密部分设为未签入 github 并单独管理。这与您放置数据库密码和服务器所需的其他凭据的配置文件类型相同。这样,当您的服务器启动时,它会从未存储在 github.
中的本地配置文件中获取所需的 credentials/secrets
然后,您也不必尝试即时更改 运行 会话中间件机密。
既然你提到了 Heroku,这里是 Heroku 提到的用于管理配置变量的技术:
通常是secret is hard-coded in node apps which use 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
。可以在应用程序仍然存在时更改它 运行?
据我所知,没有记录在案的方法来更改 运行 组 express-session 中间件的秘密。我可以想到几种“破解”方法,这些方法可以进行足够的调试侦查以深入 express-session 代码中正确的私有数据结构,或者向 express-session 添加新方法来更改秘密或禁用原始会话中间件并安装一个带有新密钥的新会话中间件。
但是,这会破坏任何现有的活动会话(因为它们所基于的 cookie 是使用原始秘密加密的)所以这可能不是一个实际的选择。
My motivation is that I put most of my code on github and I prefer not to hard-code any passwords or secrets.
如果这是您的动机,那么通常,您会将某些 configuration/deployment 文件的会话保密部分设为未签入 github 并单独管理。这与您放置数据库密码和服务器所需的其他凭据的配置文件类型相同。这样,当您的服务器启动时,它会从未存储在 github.
中的本地配置文件中获取所需的 credentials/secrets然后,您也不必尝试即时更改 运行 会话中间件机密。
既然你提到了 Heroku,这里是 Heroku 提到的用于管理配置变量的技术: