首页 > 解决方案 > 为什么我的 AWS Congito 用户在使用 Auth.currentAuthenticatedUser() 时能够登录,但“未通过身份验证”?

问题描述

我已通过 AWS 管理控制台将 AWS Cognito 用户手动添加到我的应用程序的用户池中。已确认此用户所需的用户池凭据。我正在设置一个身份验证守卫来控制对路由的访问。每当我使用 Auth.signIn() 函数时,promise 都会成功解析,但是,在登录后调用 Auth.currentAuthenticatedUser() 时,canActivate() 函数中的 promise 会返回错误消息“未通过身份验证”。我已经阅读了关于 cookieStorage 的 GitHub 问题,导致了这个问题,但没有配置这个。

登录.component.ts

signIn(username, password) {

    return new Promise(() => {
        Auth
            .signIn(username, password)
            .then(() => {
                this.router.navigate(['main/dashboard']); // navigates to main/dashboard as expected
            })
            .catch(err => {
                this.authenticationError = err.message;
            })
    });
}

auth.guard.ts

canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    return Auth
               .currentAuthenticatedUser()
               .then(() => { 
                   return true; 
               })
               .catch((err) => { 
                   this.router.navigate(['signin']);
                   console.log(err) // "not authenticated"
                   return false;
               });
}

标签: amazon-web-servicesauthenticationamazon-cognitoaws-amplify

解决方案


通过 AWS 管理控制台创建的用户不会被视为已通过身份验证,除非该用户的状态字段为 CONFIRMED。在我的例子中,状态字段是 FORCE_CHANGE_PASSWORD。AWS 希望通过控制台创建的用户在首次登录或使用电子邮件或移动验证验证其账户后更改其密码。对于我的应用程序,我不想使用电子邮件或移动验证。为了解决这个问题,我为该用户使用了以下 aws-cli 命令。

aws cognito-idp admin-set-user-password --user-pool-id your_user_pool_id --username username --password password --permanent

推荐阅读