代码之家  ›  专栏  ›  技术社区  ›  TemporaryFix

节点Lambda服务器上的Cognito用户池实现

  •  1
  • TemporaryFix  · 技术社区  · 6 年前

    到处都是成堆的文件,真的让我大吃一惊。我使用的是amazoncognito identity js包,但我也发现AWS Amplify的资源与amazoncognito identity js完全不同,尽管这个包是 "part of amplify" .

    我目前有登录,注册,并确认用户完成和工作。

    var AmazonCognitoIdentity = require('amazon-cognito-identity-js');
    
    var pool = {
        UserPoolId : 'pool-id',
        ClientId : 'client-id'
    };
    var userPool = new AmazonCognitoIdentity.CognitoUserPool(pool);
    
    var cognitoSignUp = (body, attributeList) => new Promise((acc, rej) => {
        userPool.signUp(body.email, body.password, attributeList, null, function(err, res) {
            if (err) {
                rej(err);
            } else {
                acc(res);
            }
        });
    });
    
    var cognitoSignIn = (body) => new Promise((acc, rej) => {
        var authData = {
            Username: body.email,
            Password: body.password
        }
        var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authData);
        var userData = {
            Username: body.email,
            Pool: userPool
        };
        var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);
        cognitoUser.authenticateUser(authenticationDetails, {
            onSuccess: function(res) {
                acc(res);
            }, 
            onFailure: function(err) {
                rej(err);
            }
        });
    });
    

    我的下一步是确保lambdaapi端点的安全。这是我的困难时期。

    我已经浏览了这些资源,了解如何在服务器上获取当前用户,验证用户是否经过身份验证,以及如何保护api。

    通过这项研究,我发现了两种验证当前用户的方法

    • 手动验证令牌
    • 验证会话(取自上述第4个链接)

      const AccessToken = new CognitoAccessToken({ AccessToken: tokens.accessToken });
      const IdToken = new CognitoIdToken({ IdToken: tokens.idToken });
      const RefreshToken = new CognitoRefreshToken({ RefreshToken: tokens.refreshToken });
      const sessionData = {
        IdToken: IdToken,
        AccessToken: AccessToken,
        RefreshToken: RefreshToken
      };
      const userSession = new CognitoUserSession(sessionData);
      const userData = {
        Username: email,
        Pool: this.userPool
      };
      const cognitoUser = new CognitoUser(userData);
      cognitoUser.setSignInUserSession(userSession);
      cognitoUser.getSession(function (err, session) { // You must run this to verify that session (internally)
        if (session.isValid()) {
          // Update attributes or whatever else you want to do
        } else {
          // TODO: What to do if session is invalid?
        }
      });
      

    我发现了两种保护API的方法

    • Lambda授权人
    • 作为授权人的用户池

    amazon-cognito-identity-js 它甚至没有讨论cognito返回的令牌或如何使用它们,它只是一个客户端实现。我在这上面找到的所有例子都在其他用户创建的博客上。

    有没有人有任何使用lambda的cognito用户池的指南或完整的例子?

    谢谢你

    0 回复  |  直到 6 年前