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

时间:2019-01-26 17:51:59

标签: node.js authentication aws-lambda aws-sdk

我试图在我的项目中使用cognito用户池,但是我很难找到在服务器端使用cognito的示例。

到处都是大量的文档,这真的让我失望。我正在使用amazon-cognito-identity-js程序包,但是我也在寻找AWS Amplify的资源,尽管该程序包是"part of amplify",但看起来与amazon-cognito-identity-js完全不同。

我目前具有“登录”,“注册”并确认用户已完成工作的工作。

登录/注册:

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);
        }
    });
});

下一步是确保我的Lambda API端点安全。这是我很难过的地方。

我一直在研究这些资源,以了解如何在服务器上获取当前用户并验证该用户已通过身份验证并保护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授权者
  • 作为授权者的用户池

现在,我只是不知所措而已。我对AWS文档的最大抱怨是,它告诉您您需要做什么,但没有提供有关如何执行此操作的示例。例如,我还没有找到aws示例的Authorizer东西。同样,amazon-cognito-identity-js的npm包甚至都没有讨论过cognito返回的令牌或如何使用它们,它只是一个客户端实现。我发现的所有示例都在其他用户创建的博客上。

有人对使用lambda使用cognito用户池有任何指导或完整示例吗?

谢谢

0 个答案:

没有答案