【问题标题】:Maintain session state in AWS Lambda在 AWS Lambda 中维护会话状态
【发布时间】:2023-03-08 16:08:02
【问题描述】:

如何在 AWS Lambda 中维护会话状态?例如,如果我需要查询 DynamoDb 以获取登录用户的订阅信息,如果用户使用的是 AngularJS 网络,我该如何从 Lambda 函数中执行此操作应用?

我让用户使用 Auth0 和一个在 AWS 上验证用户的自定义授权方登录。但后来我想使用登录用户的CognitoID 来查询DynamoDB。

根据 Lambda (node.js) (https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html) 的 AWS 文档,当通过 AWS 移动开发工具包调用时,您只有有关 Amazon Cognito 身份提供商的信息。

identity.cognitoIdentityId

identity.cognitoIdentityPoolId

但是如果我使用一个使用 AngularJS 和 Auth0 的网络应用程序呢?

好的,也许最简单的在 DynamoDB 中存储用户信息的解决方案就是在客户端,在 AngularJS 中提取 JWT,然后发送提取的 Auth0 user_id — 例如 @987654325 @— 在对 Lambda 的 API 请求中,它会查询用户是否存在于 DynamoDB 中,如果不存在则创建新记录。

然后,在对必须查询用户信息的 API 的每个请求中,我发送 user_id 并在 Lambda 中使用该 ID 查询数据库。它应该是安全的,因为我在 Custom Authorizer 中验证用户令牌并在请求到达 Lambda 之前拒绝或允许请求。

【问题讨论】:

    标签: amazon-web-services lambda aws-lambda auth0


    【解决方案1】:

    我已经这样做了,尽管我意识到可能有更好的解决方案:

    维护用户和会话的 DynamoDB 表。当用户使用 Cognito 登录时,使用 UUID、用户名和上次访问的时间戳在 Sessions 表中创建一个新项目。对于登录用户的所有后续调用,在 Session 表中查找用户名,并更新上次访问时间。然后,您可以将任何会话值存储在 Sessions 表中,或者将也具有会话 ID 的单独表中。

    如果用户使用 Cognito 注销,则删除(或标记为已结束)会话项目及其所有数据。如果您看到 lastAccessed 时间超过一个小时(或任何您想要的保持活动时间),则删除(或标记为已结束)该 Session 项及其所有数据。

    【讨论】:

      【解决方案2】:

      首先,Lambda 被用作无状态计算服务。因此在 Lambda 中保持会话状态是不切实际的。

      根据您的场景,您可以使用 jwt 令牌向 API Gateway 发送请求,您可以在其中插入一个特殊的 Lambda 函数调用 Custom Authorizer,您可以在其中验证令牌并提取用户 ID,然后将其转发连接到 API Gateway 端点的业务逻辑 Lambda 函数。正如您在 Custom Authorizer 中提到的,您可以查询用户数据库并将更多信息返回给业务逻辑 Lambda。

      如果令牌无效或过期,您可以从自定义授权方 Lambda 函数返回错误,以便 API 网关发回错误响应而不会命中端点 Lambda。

      此外,您还可以缓存 Custom Authorizer Lambda 的输出,以便针对给定的 TTL 对其进行缓存,从而提高性能并降低成本。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多