express - 用于无服务器上下文的 express-session 的独立替代方案(带 DynamoDB)
问题描述
背景:为什么要在 Lambda 中使用 cookie?
OWASP非常清楚cookie 是会话管理的最佳选择:
.. cookie .. 是使用最广泛的会话 ID 交换机制之一,提供其他方法不具备的高级功能。
然而,AWS 的 API Gateway 文献经常谈到使用 JWT 进行身份验证而不是使用 cookie。虽然一些技术博客似乎认为以这种方式使用 JWT 是可以的,但 JWT 肯定存在公认的问题。特别值得注意的两个问题是:
(a) 你不能轻易地验证JWT。充其量你可以保留一个被阻止 JWT 的服务器端数据库,并确保任何验证 JWT 的服务也实现对这个阻止列表的检查。这听起来很像实现常规的旧会话,很大程度上违背了使用 JWT 的意义。
(b) 如果您想使用 JWT 进行授权和身份验证,当您需要更新授权并且这不是由最终用户自己驱动的更改时,您会遇到问题。此类别中的场景包括:系统管理员或客户经理更改用户的访问级别;试用/合同由 cron 作业结束;webhook 由第三方 SaaS 集成(例如 Stripe)触发。您可能会说,“在这种情况下,请使用单独的授权机制”,但是您又回到了良好的旧会话。
需要明确的是,我理解 JWT 在让一台服务器将其对用户身份的信任传达给另一台服务器方面的价值,但这与会话管理的目的截然不同。
Node 中的会话管理
所有的道路似乎都通向 Node.js 中express-session
最久经考验的会话实现。它提供了广泛的存储选项供您选择*。
在 Lambdas 的上下文中,原则上您可以尝试使用express-session
它,就好像它只是一个函数工厂一样,对于带有签名的函数(req,res,next)=>void
,这相当 hacky,并且绝不是 express-sessions 推荐的。也不完全清楚如何最好地将该调用签名与您在 AWS Lambda 中获得的对象进行匹配,也不清楚哪些存储机制针对 lambdas 进行了优化(它们是短暂的,需要快速启动)。
我真的很想要一个轻量级节点模块,它可以让您执行以下操作:
import {Sessions} from 'sessions';
// configure session management. Should be super lightweight for use in Lambda.
const sessions = new Sessions({
/* ..basic cookie & expiration config, */
secret: "something", // extra security recommended by express
store: { // object with following interface:
createSession(sessionId, metadata),
getFromSessionId(sessionId),
updateSession(sessionId, metadata),
customIndexedProperties: ['userId'], // in addition to sessionId
getSessionIdsFromIndexedProperty(propertyName, propertyValue),
}
});
// create session. Note the api is not opinionated about response header mechanics.
response.headers['set-cookie'] = await sessions.createCookieForSession({
userId: 'user1',
/*...other user info */
});
// get user's session. Again not opinionated about where cookie comes from.
const userSessionInfo = await sessions.getSessionFromCookie(request.header['cookies']);
// update a user's session, but not initiated by the user themselves
const sessionIds = await sessions.getSessionIdsFromIndexedProperty('userId', 'user1');
await sessions.updateSession(sessionIds[0], {something: 'has change'});
问题
- 我的上述想法合理吗?
- 有没有我没有遇到过的可能有用的节点包。
- 如果不是,为什么不呢?我遇到过一些问题密切相关的人,但在使用无服务器时,这一定是一个相当普遍的问题。
- 如果我要根据自己的喜好实现一个模块,我如何才能确信我在安全方面做得很好?我可以使用
express-session
相关的部分,但这对于良好的安全性来说并不是一个很好的长期解决方案。 - 与 4 相关,如果我尝试加入 express-sessions,但只是建立自己的商店来满足我的需求,我将如何对安全性充满信心?此外,我还没有找到任何关于 express-session 存储的官方 api 是什么的文档,考虑到 express-sessions 似乎是 Node.js 中会话的首选,我觉得这很神奇。
任何帮助将不胜感激,谢谢!
PS 我很欣赏我所讨论的很多与通常资金不足的开源项目有关的内容。然而,对于生态系统的状态得出上述结论,我感到非常惊讶,并想知道我是否遗漏了什么。
*令人讨厌的是,建议的 DynamoDb 商店包不是很好。我们希望它的两个功能不被支持,实际上 PR 似乎已经在 2019 年开放,但维护者从未看过。从技术上讲,我们不一定必须使用 DynamoDb 作为我们的商店,但它确实提供了很多我们喜欢的功能。
解决方案
推荐阅读
- google-anthos - 将 GCE 虚拟机迁移到 GKE 后,systemd 服务会发生什么?
- azure - 使用 Curl 访问受 Microsoft Identity Platform (Azure Ad) 保护的 API
- ios - 在自定义 TableViewCell 中按下按钮时从 API 打开 URL
- openlayers - 在 OpenLayers 5 中绘制简单的网格
- pyramid - 如何在我的 layout.pt 变色龙模板中调用 request.static_url() 中的缓存破坏函数
- c++ - 如何为结构类型变量赋值?
- c# - .razor 文件中的 Blazor 基本标记和 @page 指令
- c - 如何使用 malloc 和结构指针数组
- javascript - 如何通过刷新令牌更新访问令牌?
- python - AttributeError:模块“keras.backend”没有属性“_BACKEND”