我正在尝试通过不带密码的链接来实现身份验证。例如。用户输入他的电子邮件-> cognito发送带有用户可以单击并登录的链接的电子邮件。
cognito通过自定义挑战提供支持。例如。 https://aws-amplify.github.io/amplify-js/media/authentication_guide#using-a-custom-challenge
我已经创建了与我的认知池关联的DefineAuthChallenge
,CreateAuthChallenge
,VerifyAuthChallenge
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
函数中保存和重建用户对象。或者,如果有更好的方法通过不带密码的链接登录?
答案 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)