AWS lambda 无服务器网站会话维护

Posted

技术标签:

【中文标题】AWS lambda 无服务器网站会话维护【英文标题】:AWS lambda serverless website session maintaining 【发布时间】:2017-05-30 19:38:45 【问题描述】:

我使用 node.js 作为后端开发了一个网站。 最近我正在尝试使其无服务器并部署到 lambda。 我将重写我的大部分代码,但还没有弄清楚如何在用户登录后维护会话。我使用的是“express-session”模块,会话数据都记录在数据库中。

说实话,我对会话的理解不是很深。 我在谷歌上搜索并没有找到我需要的东西。 有没有人有一些关于使用 lambda 维护会话的示例代码? 或任何资源。非常感谢!

【问题讨论】:

【参考方案1】:

在Amazon Cognito Identity SDK for javascript 中,特别检查用例16,它显示了如何检索Cognito 当前用户。您可以使用此函数在页面之间传递当前用户属性。

    var poolData = 
        UserPoolId : '...', // Your user pool id here
        ClientId : '...' // Your client id here
    ;
    var userPool = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(poolData);
    var cognitoUser = userPool.getCurrentUser();

    if (cognitoUser != null) 
        cognitoUser.getSession(function(err, session) 
            if (err) 
                alert(err);
                return;
            
            console.log('session validity: ' + session.isValid());
            // other AWS actions ...
        );
    

【讨论】:

【参考方案2】:

HTTP 中有多种机制可用于维护会话 Web 应用程序中的状态,例如 cookie(标准 HTTP 标头), URL 参数,GET 请求的 URL 参数,POST 的正文参数 请求,例如隐藏的表单字段(html 表单)或专有 HTTP 标题。

来源:Session Management Cheat Sheet

AWS Lambda 与会话管理无关,除非您想重新发明***并编写 Lambda 函数来存储/检索数据库中的会话变量,在这种情况下,我建议您使用 Amazon Cognito 进行会话管理。见Amazon Cognito Identity SDK for JavaScript。

【讨论】:

我很困惑的一件事是,如果您想使用匿名用户并在 oauth 流中存储一个“状态”字符串怎么办。 Cognito 是否为此矫枉过正?例如此处的步骤 2-4:jsapi.apiary.io/apis/starlingbankapi/reference/0/customer-api/… @timhc22 在这种特殊情况下,我不认为 Cognito 是正确的选择。就个人而言,我会使用 localStorage 直到我需要对用户进行身份验证/注册。【参考方案3】:

无论您使用 Cognito 还是您自己的会话管理方式,请注意 lambda 调用 share their runtime 并在它们之间共享静态状态。确保您的设计考虑到这一事实并相应地构建您的会话共享。

https://www.linkedin.com/pulse/does-lambda-call-share-any-commonstate-santhosh-gandhe/

【讨论】:

以上是关于AWS lambda 无服务器网站会话维护的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda&Fargate 无服务底层技术是如何实现的

AWS 无服务器 Java Lambda 调试

无服务器/AWS-Lambda 设置的 graphiql UI 损坏

为 AWS Lambda 和无服务器推荐啥本地节点版本

通过 AWS Lambda 和 Cognito 注册用户(无服务器架构)

AWS 无服务器自定义 jwt 授权方 lambda 设置 cors 响应