通过链接的Cognito无密码身份验证

时间:2018-10-12 22:00:26

标签: amazon-web-services authentication amazon-cognito aws-amplify amplifyjs

我正在尝试通过不带密码的链接来实现身份验证。例如。用户输入他的电子邮件-> cognito发送带有用户可以单击并登录的链接的电子邮件。

cognito通过自定义挑战提供支持。例如。 https://aws-amplify.github.io/amplify-js/media/authentication_guide#using-a-custom-challenge

我已经创建了与我的认知池关联的DefineAuthChallengeCreateAuthChallengeVerifyAuthChallenge lambda函数。 CreateAuthChallenge生成代码,并发送到带有网站链接的用户电子邮件。

接下来,我打算从网站的网址中获取该代码,并像在文档中一样通过它登录用户

Auth.signIn(username)
    .then(user => {
        if (user.challengeName === 'CUSTOM_CHALLENGE') {
            Auth.sendCustomChallengeAnswer(user, challengeResponse)
                .then(user => console.log(user))
                .catch(err => console.log(err));
        } else {
            console.log(user);
        }
    })
    .catch(err => console.log(err));

但这是问题所在。 Auth.sendCustomChallengeAnswer要求从Auth.signIn传递的用户对象。但是,如果用户仅单击电子邮件中的链接,则根本没有任何用户对象。并放大lib不要保存该中间会话用户对象,因此在页面上重新加载丢失的对象。仅当身份验证完成到其存储https://github.com/aws-amplify/amplify-js/blob/master/packages/amazon-cognito-identity-js/src/CognitoUser.js#L175

时,它才会保存

所以问题是我如何从页面重新加载时的Auth.signIn函数中保存和重建用户对象。或者,如果有更好的方法通过不带密码的链接登录?

1 个答案:

答案 0 :(得分:0)

要首先解决此问题,您需要将用户名和会话保存到本地存储或cookie中。然后,当用户通过链接时,可以使用以下代码:

 const userPoolData = {
    UserPoolId: process.env.COGNITO_POOL_ID,
    ClientId: process.env.COGNITO_POOL_WEB_CLIENT_ID,
    Storage: customStorageClass // default is localstorage
  }

  const userPool = new CognitoUserPool(userPoolData)

  const userData = {
    Username: getUsernameFromCookiesOrLocalstorage,
    Pool: userPool,
    Storage: customStorageClass // default is localstorage
  }
  const user = new CognitoUser(userData)
  user.Session = getSessionFromCookiesOrLocalstorage
  Auth.sendCustomChallengeAnswer(user, code)