我已使用图片中显示的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
请帮我解决这个问题。
答案 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
帮助者。该函数正在寻找三个参数(username
,code
,password
):
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.completeNewPasswordChallenge
和CognitoUserPool.signUp
方法发送输入元素的值。该请求在Chrome中看起来不错,在Vue开发工具中值似乎还可以,并且Amazon的错误消息是含糊不清的,没有文档记录。
问题是我发送了输入元素节点本身而不是它们的值:variableName
而不是this.variableName
。