1

我是 Cognito 的新手,并且陷入了一段时间。

我正在尝试使用 Cognito 登录用户。响应第一次返回 NEW_PASSWORD_REQUIRED 质询。

import Auth from '@aws-amplify/auth';

...

Auth.signIn(this.username, this.password)
            .then((user: any) => {
                if (user) {
                    if (user.challengeName && user.challengeName == 'NEW_PASSWORD_REQUIRED') {
                        this.sessionService.setUser(user);
                        this.router.navigate([this.confirmAccountUrl]);
                    } else {
                        this.router.navigate([this.dashboardUrl]);
                    }
                }
            })
            .catch((error: any) => {
                switch (error.code) {
                    case 'UserNotConfirmedException':
                        this.router.navigate([this.confirmAccountUrl]);
                        break;
                    case 'NotAuthorizedException':
                        this.message = 'Your temporary password is expired and must be reset by admin';
                        break;
                    case 'UsernameExistsException':
                        this.message = 'Invalid username or password';
                        break;
                }
            });

我希望用户转到下一个组件并在那里提供密码。

问题是返回的结果是CognitoUser类型。这需要传递给reset-password组件。

我尝试将结果保存到会话并在重置密码组件中检索。

    constructor(
    private sessionService: SessionService
) {
    this.user = this.sessionService.getUser();
}

resetPassword() {
    Auth.completeNewPassword(this.user, this.new_password)
        .then((data) => {
            console.log(data);
        })
        .catch((err) => console.error('Error', err));
}

这给了我错误:

Error TypeError: user.completeNewPasswordChallenge is not a function

我在 google 上做了一些研究,发现user实际上是一个 json 对象,但不是CognitoUser类型

没有可以将用户解析为CognitoUser的函数,Amplify 中也没有存储它的函数。

这是会话服务:

import { Injectable } from '@angular/core';
import { SessionStorageService } from 'angular-web-storage';

@Injectable({
    providedIn: 'root'
})
export class SessionService {

constructor(
    private sessionStorageService: SessionStorageService
) { }

setUser(user: any) {
    this.sessionStorageService.set('user', user);
}

getUser(): any {
    return this.sessionStorageService.get('user');
}
}

Auth.authenticatedUser不会返回值,因为用户尚未通过身份验证。

我在这里做错了什么?

4

1 回答 1

0

有同样的问题,并尝试CognitoUser手动重建对象:

const pool = new CognitoUserPool({
      UserPoolId: cognitoObject.pool.userPoolId,
      ClientId: cognitoObject.pool.clientId,
      endpoint: cognitoObject.client.endpoint,
      Storage: window.localStorage,
      AdvancedSecurityDataCollectionFlag: cognitoObject.advancedSecurityDataCollectionFlag,
})
const cognitoUser = new CognitoUser({
      Username: cognitoObject.username,
      Pool: pool,
      Storage: window.localStorage,
})

cognitoUser.Session = cognitoObject.Session

await Auth.completeNewPassword(cognitoUser, newPassword, cognitoObject.challengeParams)

来源:https ://github.com/aws-amplify/amplify-js/issues/1715#issuecomment-800999983

但正如它所说,我无法让它工作CognitoUserPool is undefined

我使用以下导入语句修复了它:

import { CognitoUser, CognitoUserPool } from 'amazon-cognito-identity-js';

于 2021-11-05T14:45:07.480 回答