在 AWS Lambda 中维护会话状态

Mol*_*ont 0 lambda amazon-web-services aws-lambda auth0

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

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

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

identity.cognitoIdentityId

identity.cognitoIdentityPoolId
Run Code Online (Sandbox Code Playgroud)

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

好吧,也许在 DynamoDB 中存储用户信息的最简单的解决方案就是在客户端提取JWT,在 AngularJS 中,然后将提取的 Auth0(user_id例如)facebook|12345在 API 请求中发送到 Lambda,Lambda 查询用户是否DynamoDB 中存在,如果不存在则创建新记录。

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

Ash*_*han 5

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

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

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

此外,您还可以缓存自定义授权程序 Lambda 的输出,以便针对给定的 TTL 进行缓存,以提高性能并降低成本。