首页 > 解决方案 > 用于无服务器上下文的 express-session 的独立替代方案(带 DynamoDB)

问题描述

背景:为什么要在 Lambda 中使用 cookie?

OWASP非常清楚cookie 是会话管理的最佳选择:

.. cookie .. 是使用最广泛的会话 ID 交换机制之一,提供其他方法不具备的高级功能。

然而,AWS 的 API Gateway 文献经常谈到使用 JWT 进行身份验证而不是使用 cookie。虽然一些技术博客似乎认为以这种方式使用 JWT 是可以的,但 JWT 肯定存在公认的问题。特别值得注意的两个问题是:

需要明确的是,我理解 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'});

问题

  1. 我的上述想法合理吗?
  2. 有没有我没有遇到过的可能有用的节点包。
  3. 如果不是,为什么不呢?我遇到过一些问题密切相关的人,但在使用无服务器时,这一定是一个相当普遍的问题。
  4. 如果我要根据自己的喜好实现一个模块,我如何才能确信我在安全方面做得很好?我可以使用express-session相关的部分,但这对于良好的安全性来说并不是一个很好的长期解决方案。
  5. 与 4 相关,如果我尝试加入 express-sessions,但只是建立自己的商店来满足我的需求,我将如何对安全性充满信心?此外,我还没有找到任何关于 express-session 存储的官方 api 是什么的文档,考虑到 express-sessions 似乎是 Node.js 中会话的首选,我觉得这很神奇。

任何帮助将不胜感激,谢谢!

PS 我很欣赏我所讨论的很多与通常资金不足的开源项目有关的内容。然而,对于生态系统的状态得出上述结论,我感到非常惊讶,并想知道我是否遗漏了什么。


*令人讨厌的是,建议的 DynamoDb 商店包不是很好。我们希望它的两个功能不被支持,实际上 PR 似乎已经在 2019 年开放,但维护者从未看过。从技术上讲,我们不一定必须使用 DynamoDb 作为我们的商店,但它确实提供了很多我们喜欢的功能。

标签: expresscookiesaws-lambdaamazon-dynamodbserverless

解决方案


推荐阅读