如何在AWS Lambda中维护会话状态?例如,如果我需要查询DynamoDb以获取已登录用户的订阅信息,如果用户使用的是AngularJS Web应用程序,如何从Lambda函数执行此操作?我让用户使用Auth0和自定义授权程序登录,以验证AWS上的用户。但后来我想使用登录用户CognitoID来查询DynamoDB。
根据Lambda的AWS文档(node.js)(https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html),您只能通过AWS Mobile SDK调用有关Amazon Cognito身份提供程序的信息。
identity.cognitoIdentityId
identity.cognitoIdentityPoolId
但是,如果我使用的是使用AngularJS和Auth0的网络应用程序呢?
好吧,也许在DynamoDB中存储用户信息的最简单的解决方案就是在AngularJS中提取JWT客户端并使用提取的Auth0 user_id如facebook | 12345将它在API请求中发送给Lambda,查询是否用户存在于DynamoDB中,如果不存在则创建新记录。然后,在每个请求查询用户信息的API的请求中,我发送user_id,并在Lambda中查询具有该id的数据库。它应该是安全的,因为我在自定义授权程序中验证用户令牌并在它到达Lambda之前拒绝或拒绝。
答案 0 :(得分:4)
首先,Lambda用作无状态计算服务。因此,在Lambda中保持会话状态是不切实际的。
根据您的场景,您可以使用jwt令牌向API Gateway发送请求,您可以在其中插入一个特殊的Lambda函数调用Custom Authorizer,您可以在其中验证令牌并提取用户ID,然后转发该用户ID到连接到API网关端点的Business Logic Lambda函数。正如您在Custom Authorizer中提到的,您可以查询用户数据库并将更多信息返回给Business Logic Lambda。
如果令牌无效或过期,您可以从Custom Authorizer Lambda函数返回错误,这样API网关就会发回错误响应,而不会点击端点Lambda。
此外,您还可以缓存Custom Authorizer Lambda的输出,以便为给定的TTL缓存它,以提高性能并降低成本。
答案 1 :(得分:0)
我已经这样做了,尽管我意识到可能会有更好的解决方案:
为用户和会话维护DynamoDB表。当用户使用Cognito登录时,请在会话表中使用UUID,用户名和上次访问的时间戳创建一个新项目。对于所有随后登录用户的调用,请在“会话”表中查找用户名,并更新上次访问时间。然后,您可以将任何会话值存储在“会话”表中,也可以将单独的具有会话ID的表存储在其中。
如果用户使用Cognito注销,则删除(或标记为已结束)“会话”项及其所有数据。如果您看到lastAccessed时间超过一个小时(或您想要的保持有效时间),请删除(或标记已结束)该Session项目及其所有数据。