AWS Cognito - SerializationException(在不期望的地方找到结构或映射的开始)

时间:2018-04-20 05:46:24

标签: javascript angular amazon-web-services amazon-cognito

我已使用图片中显示的create user选项在Cognito用户池中创建了一个用户,并希望该用户在首次登录时设置新密码。为此,我使用AWS文档中给出的下面给出的方法 Create User from AWS

  

cognitouser.completeNewPasswordChallenge()

以下是我的代码

//Start: setNewPasswordForAdmin
    setNewPasswordForAdmin(username: string, password: string) {

        //Start: Creating new user with username and pool data
        const adminUserdata = {
            Username: username,
            Pool: userpoolAdmin
        }
        const adminuser = new CognitoUser(adminUserdata);
        //End: Creating new user with username and pool data


        //create attributelist array which will contain all the attributes requried for signing in
        //these attributes are those attributes, which are selected while creating user pool on aws
        const attributeList : CognitoUserAttribute[] = [];

        //form a json object containing Name and Value of attribute used
        const usernameattribute = {
            Name:'username',
            Value: username
        }

        //Push list of attributes in the attributeList array
        attributeList.push(new CognitoUserAttribute(usernameattribute));
        console.log(attributeList);
        const that = this;

        adminuser.completeNewPasswordChallenge(password, attributeList ,{
            onFailure(err){

                console.log(err);
            },
            onSuccess(result){
                console.log(":::::::: Password change successfull ");

                that.router.navigate(['']);
            }
        });
    }
    //End: setNewPasswordForAdmin

执行此操作后,我收到错误消息

  

{code:" SerializationException",name:" SerializationException",   消息:"在不期望的地方找到结构或地图的开始。"}

这些是我在用户池中选择的属性

List Of Attributes and permissions in user pool

请帮我解决这个问题。

3 个答案:

答案 0 :(得分:0)

我遇到了完全相同的问题,无法在线上找到比某些数据格式错误的更好的答案。

由于您可能正在使用 amazon-cognito-identity-js 库,并且该库已不在开发中,所以我建议您升级到 aws-amplify 现在已包含并且是最新的。

要使用它,请先 npm安装aws-amplify aws-sdk ,然后在您的 main.ts 文件中配置用户池:

Amplify.configure({
  Auth: {
    region: 'eu-west-1',
    userPoolId: 'eu-west-1_fasd8734s',
    userPoolWebClientId: 'asd387dhaskj'
  }
});

接下来,实施本文档中的登录方法https://aws-amplify.github.io/docs/js/authentication#sign-in

您可以像示例中那样使用async await,也可以在cognito服务中创建较小的方法,并将其包装在Observables中,如下所示:

import { from, Observable, throwError } from 'rxjs';
import { Auth } from 'aws-amplify';
import { catchError } from 'rxjs/operators';

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

  public authenticate(username: string, password: string): Observable<any> {
    return from(Auth.signIn(username, password)).pipe(
      catchError(error => throwError(error))
    );
  }

  public completeNewPassowrd(user: any, newPassword: string): Observable<any> {
    return from(
      Auth.completeNewPassword(
        user, // Cognito User Object
        newPassword,
        {}
      )
    ).pipe(catchError(error => throwError(error)));
  }

  public getSession() {
    return from(Auth.currentSession()).pipe(
      catchError(error => throwError(error))
    );
  }

  public getAccessToken() {
    return from(Auth.currentSession()).pipe(
      map((session: any) => {
        return session.getAccessToken();
      }),
      catchError(error => throwError(error))
    );
  }

}

我能够通过更改为aws-amplify来解决该问题,希望它能对您有所帮助,即使它不能直接回答您的问题。

答案 1 :(得分:0)

以我为例,最终结果是格式错误的数据被发送到我的resetPassword帮助者。该函数正在寻找三个参数(usernamecodepassword):

export default function (username, code, password) {
    …
}

…而我将它们作为对象发送:

yield call(authResetPassword, {
    code: DOMPurify.sanitize(verificationCode),
    username: DOMPurify.sanitize(email),
    password: DOMPurify.sanitize(newPassword),
})

我刚刚更新了助手,并且一切就绪!

export default function ({ username, code, password }) {
    …
}

只需将数据记录在setNewPasswordForAdmin函数中,我敢打赌,您会在其中发现一些问题。

答案 2 :(得分:-1)

编辑:由于OP的函数参数类型,除非两个参数均为String,否则它将不会执行。他们不是我的情况,所以问题有所不同。但是,当一个Google搜索此错误消息时,将显示此页面,因此如果其他人遇到与我相同的问题,我将在下面保留原始答案

我遇到了(编辑:几乎)相同的问题。据我所知,尽管我也使用Cognito客户端应用程序,但在各种AWS API上都可能发生此响应,并且它并非特定于Cognito。

当您的请求正文包含错误类型的变量(例如,布尔值代替字符串(在我的情况下,对象代替字符串)。

但是,仅知道这一点对我没有帮助。 我正在使用Vue.js,使用amazon-cognito-identity-js的CognitoUserPool.completeNewPasswordChallengeCognitoUserPool.signUp方法发送输入元素的值。该请求在Chrome中看起来不错,在Vue开发工具中值似乎还可以,并且Amazon的错误消息是含糊不清的,没有文档记录。

问题是我发送了输入元素节点本身而不是它们的值:variableName而不是this.variableName