I am trying to use the listUsers function for AWS Cognito in Angular 2. Every time the function is called I receive the Error stating that listUsers is not a function.
I am using the AWS Cognito Quickstart for Angular 2 (https://github.com/awslabs/aws-cognito-angular2-quickstart) example I am adding to the cognito.service.ts file to try to incorporate the listUsers functionality.
The documentation for the Javascript SDK for Cognito (http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html#listUsers-property) says to call the function like the following:
var params = {
UserPoolId: 'STRING_VALUE', /* required */
AttributesToGet: [
'STRING_VALUE',
/* more items */
],
Filter: 'STRING_VALUE',
Limit: 0,
PaginationToken: 'STRING_VALUE'
};
cognitoidentityserviceprovider.listUsers(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
I have tried to use the listUsers function in cognito.service.ts like this:
@Injectable()
export class CognitoUtil {
public static _REGION = environment.region;
public static _IDENTITY_POOL_ID = environment.identityPoolId;
public static _USER_POOL_ID = environment.userPoolId;
public static _CLIENT_ID = environment.clientId;
public static _POOL_DATA = {
UserPoolId: CognitoUtil._USER_POOL_ID,
ClientId: CognitoUtil._CLIENT_ID
};
public static getAwsCognito(): any {
return AWSCognito;
}
getUserPool() {
return new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(CognitoUtil._POOL_DATA);
}
getCurrentUser() {
return this.getUserPool().getCurrentUser();
}
getList(myparams){
var params = {
UserPoolId: environment.userPoolId, /* required */
AttributesToGet: [],
Filter: "",
Limit: 10
};
var cognito = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(CognitoUtil._POOL_DATA);
cognito.listUsers(params, function(err, data) {
if (err) console.log(err, err.stack);// an error occurred
else return data;// successful response
});
}
getCognitoIdentity(): string {
return AWS.config.credentials.identityId;
}
getAccessToken(callback: Callback): void {
if (callback == null) {
throw("CognitoUtil: callback in getAccessToken is null...returning");
}
if (this.getCurrentUser() != null)
this.getCurrentUser().getSession(function (err, session) {
if (err) {
console.log("CognitoUtil: Can't set the credentials:" + err);
callback.callbackWithParam(null);
}
else {
if (session.isValid()) {
callback.callbackWithParam(session.getAccessToken().getJwtToken());
}
}
});
else
callback.callbackWithParam(null);
}
getIdToken(callback: Callback): void {
if (callback == null) {
throw("CognitoUtil: callback in getIdToken is null...returning");
}
if (this.getCurrentUser() != null)
this.getCurrentUser().getSession(function (err, session) {
if (err) {
console.log("CognitoUtil: Can't set the credentials:" + err);
callback.callbackWithParam(null);
}
else {
if (session.isValid()) {
callback.callbackWithParam(session.getIdToken().getJwtToken());
} else {
console.log("CognitoUtil: Got the id token, but the session isn't valid");
}
}
});
else
callback.callbackWithParam(null);
}
getRefreshToken(callback: Callback): void {
if (callback == null) {
throw("CognitoUtil: callback in getRefreshToken is null...returning");
}
if (this.getCurrentUser() != null)
this.getCurrentUser().getSession(function (err, session) {
if (err) {
console.log("CognitoUtil: Can't set the credentials:" + err);
callback.callbackWithParam(null);
}
else {
if (session.isValid()) {
callback.callbackWithParam(session.getRefreshToken());
}
}
});
else
callback.callbackWithParam(null);
}
refresh(): void {
this.getCurrentUser().getSession(function (err, session) {
if (err) {
console.log("CognitoUtil: Can't set the credentials:" + err);
}
else {
if (session.isValid()) {
console.log("CognitoUtil: refreshed successfully");
} else {
console.log("CognitoUtil: refreshed but session is still not valid");
}
}
});
}
}
This is how I am calling the getList(params) in the component:
constructor(public cognitoUtil: CognitoUtil){}
viewUsers(){
console.log(this.cognitoUtil.getList(this.param));
}
I have tried multiple times different things to get this working and I cannot seem to get it to work. I have tried ListUsers instead of listUsers, and I have tried calling getUserPool() instead of using AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(CognitoUtil._POOL_DATA).
Update
I have changed AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool
to AWS.CognitoIdentityServiceProvider
like suggested. I am now receiving the error:
ConfigError: Missing region in config
Stack trace:
_xamzrequire<[33]</n.EventListeners.Core</<@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:11200
_xamzrequire<[58]</n.SequentialExecutor<.callListeners@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:21879
o@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:21745
_xamzrequire<[33]</n.EventListeners.Core</</<@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:11061
e@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:5:24062
_xamzrequire<[20]</n.Config<.getCredentials@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:5:24648
_xamzrequire<[33]</n.EventListeners.Core</<@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:10913
_xamzrequire<[58]</n.SequentialExecutor<.callListeners@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:21850
_xamzrequire<[58]</n.SequentialExecutor<.emit@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:21585
_xamzrequire<[54]</</n.Request<.emitEvent@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:3:9935
_xamzrequire<[54]</</c.setupStates/t@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:3:5785
_xamzrequire<[82]</n.prototype.runTo@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:1187
_xamzrequire<[54]</</n.Request<.runTo@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:3:7345
_xamzrequire<[54]</</n.Request<.send@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:3:7243
_xamzrequire<[59]</n.Service<.makeRequest@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:2:27369
_xamzrequire<[59]</<.defineMethods/</t.prototype[e]@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:2:30572
CognitoUtil.prototype.getList@http://localhost:3000/main.bundle.js:436:10
organizationsViewComponent.prototype.viewUsersInOrg@http://localhost:3000/main.bundle.js:1435:22
anonymous/_View_organizationsViewComponent1.prototype._handle_click_13_0@organizationsViewComponent.ngfactory.js:1991:15
[2]/</</DebugAppView</DebugAppView.prototype.eventHandler/<@http://localhost:3000/vendor.bundle.js:9712:29
decoratePreventDefault/<@http://localhost:3000/vendor.bundle.js:11832:41
[3]/</</DomEventsPlugin</DomEventsPlugin.prototype.addEventListener/outsideHandler/<@http://localhost:3000/vendor.bundle.js:11945:116
ZoneDelegate.prototype.invoke@http://localhost:3000/polyfills.bundle.js:14768:18
NgZoneImpl/this.inner<.onInvoke@http://localhost:3000/vendor.bundle.js:6256:33
ZoneDelegate.prototype.invoke@http://localhost:3000/polyfills.bundle.js:14767:18
Zone.prototype.runGuarded@http://localhost:3000/polyfills.bundle.js:14664:29
[2]/</</NgZoneImpl</NgZoneImpl.prototype.runInnerGuarded@http://localhost:3000/vendor.bundle.js:6285:72
[2]/</</NgZone</NgZone.prototype.runGuarded@http://localhost:3000/vendor.bundle.js:6518:63
[3]/</</DomEventsPlugin</DomEventsPlugin.prototype.addEventListener/outsideHandler@http://localhost:3000/vendor.bundle.js:11945:79
ZoneDelegate.prototype.invokeTask@http://localhost:3000/polyfills.bundle.js:14801:22
Zone.prototype.runTask@http://localhost:3000/polyfills.bundle.js:14690:29
ZoneTask/this.invoke@http://localhost:3000/polyfills.bundle.js:14871:29
_xamzrequire<[33]</n.EventListeners.Core</<@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:11200
_xamzrequire<[58]</n.SequentialExecutor<.callListeners@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:21879
o@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:21745
_xamzrequire<[33]</n.EventListeners.Core</</<@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:11061
e@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:5:24062
_xamzrequire<[20]</n.Config<.getCredentials@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:5:24648
_xamzrequire<[33]</n.EventListeners.Core</<@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:10913
_xamzrequire<[58]</n.SequentialExecutor<.callListeners@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:21850
_xamzrequire<[58]</n.SequentialExecutor<.emit@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:21585
_xamzrequire<[54]</</n.Request<.emitEvent@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:3:9935
_xamzrequire<[54]</</c.setupStates/t@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:3:5785
_xamzrequire<[82]</n.prototype.runTo@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:4:1187
_xamzrequire<[54]</</n.Request<.runTo@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:3:7345
_xamzrequire<[54]</</n.Request<.send@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:3:7243
_xamzrequire<[59]</n.Service<.makeRequest@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:2:27369
_xamzrequire<[59]</<.defineMethods/</t.prototype[e]@http://localhost:3000/assets/js/aws-sdk-2.7.13.min.js:2:30572
CognitoUtil.prototype.getList@http://localhost:3000/main.bundle.js:436:10
organizationsViewComponent.prototype.viewUsers@http://localhost:3000/main.bundle.js:1435:22
anonymous/_View_organizationsViewComponent1.prototype._handle_click_13_0@organizationsViewComponent.ngfactory.js:1991:15
[2]/</</DebugAppView</DebugAppView.prototype.eventHandler/<@http://localhost:3000/vendor.bundle.js:9712:29
decoratePreventDefault/<@http://localhost:3000/vendor.bundle.js:11832:41
[3]/</</DomEventsPlugin</DomEventsPlugin.prototype.addEventListener/outsideHandler/<@http://localhost:3000/vendor.bundle.js:11945:116
ZoneDelegate.prototype.invoke@http://localhost:3000/polyfills.bundle.js:14768:18
NgZoneImpl/this.inner<.onInvoke@http://localhost:3000/vendor.bundle.js:6256:33
ZoneDelegate.prototype.invoke@http://localhost:3000/polyfills.bundle.js:14767:18
Zone.prototype.runGuarded@http://localhost:3000/polyfills.bundle.js:14664:29
[2]/</</NgZoneImpl</NgZoneImpl.prototype.runInnerGuarded@http://localhost:3000/vendor.bundle.js:6285:72
[2]/</</NgZone</NgZone.prototype.runGuarded@http://localhost:3000/vendor.bundle.js:6518:63
[3]/</</DomEventsPlugin</DomEventsPlugin.prototype.addEventListener/outsideHandler@http://localhost:3000/vendor.bundle.js:11945:79
ZoneDelegate.prototype.invokeTask@http://localhost:3000/polyfills.bundle.js:14801:22
Zone.prototype.runTask@http://localhost:3000/polyfills.bundle.js:14690:29
ZoneTask/this.invoke@http://localhost:3000/polyfills.bundle.js:14871:29
The listUsers operation is exposed through the main AWS SDK and it is an authenticated operation meaning that it requires AWS credentials to be present to run. Some code in node:
var aws = require('aws-sdk');
aws.config.update({accessKeyId: 'akid', secretAccessKey: 'secret'});
var CognitoIdentityServiceProvider = aws.CognitoIdentityServiceProvider;
var client = new CognitoIdentityServiceProvider({ apiVersion: '2016-04-19', region: 'us-east-1' });
//now you can call listUsers on the client object
Note that there might be different ways in which you can configure the AWS credentials to call the operation. You do need credentials as this is an authenticated operation. CreateUserPool is similar, you just need to pass the appropriate parameters as JSON in the call.