我尝试使用带有用户池的AWS Cognito通过我的API进行身份验证。我有一个通过AWS Cognito用户池创建的用户,并且我尝试使用该用户登录。
我得到的错误是CredentialsError: Missing credentials in config
。特别是它告诉我,我需要一个IdentityPoolId
。但我似乎无法在我的AWS控制台中找到此IdentityPoolId
。在哪里,我从我的用户池得到这个?我看到的只是一个Pool id和一个Pool ARN。
相关源代码:
var aws = require('aws-sdk');
aws.config.update({
region: 'us-east-1',
credentials: new aws.CognitoIdentityCredentials({
IdentityPoolId: '???'
})
});
var authUser = function(params, callback)
{
if (!params || !params.Email || !params._password)
{
callback(new Error('Invalid parameters.'));
return false;
}
var cognito = new aws.CognitoIdentityServiceProvider();
var authParams = {
AuthFlow: 'USER_SRP_AUTH', // not sure what this means...
ClientId: conf.AWSConfig.ClientId,
AuthParameters: {
Username: params.Email,
Password: params._password
}
};
cognito.initiateAuth(authParams, function(err, data)
{
if (err)
{
console.log('Error details: ' + util.inspect(err));
callback(err);
return false;
}
callback(null, {success: true, data: data});
});
}
对于authParams
对象,我不确定AuthFlow
应该是什么。看http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html#initiateAuth-property似乎USER_SRP_AUTH
似乎是我应该使用的。
修改
我相信我可能已经找到了IdentityPoolId
的位置。在编辑身份池时,我查看了Federated Identities
部分并添加到User Pool
部分下的相应Authentication Providers
部分。
我将Authentication Provider
的{{1}}与我创建的用户池相关联,方法是输入该用户池的Cognito
和User Pool ID
。现在使用相同的代码App Client ID
我收到错误Identity pool ID
。它说CredentialsError: Missing credentials in config
。好的......我试图授权用户......我是否需要创建一个未经身份验证的角色,以便用户在未经过身份验证时进行身份验证?如果这就是我需要做的事情,这似乎很愚蠢。
编辑2:
我还应该注意,我能够使用Javascript SDK(而不是nodejs)登录并获得Unauthorized access is not supported for this identity pool
以及AccessToken
和IdToken
。我这样做了,不需要RefreshToken
。我唯一需要的是IdentityPoolId
和UserPoolId
。
ClientId
答案 0 :(得分:3)
事实证明initiateAuth
根本不是我想做的事情。我还缺少一个名为amazon-cognito-identity-js
的npm包。安装完成后,我更新了我的代码,如下所示:
var authUser = function(params, callback)
{
if (!params || !params.Email || !params._password)
{
callback(new Error('Invalid parameters.'));
return false;
}
var poolData = {
UserPoolId: conf.AWSConfig.UserPoolId,
ClientId: conf.AWSConfig.ClientId
};
var userPool = new aws.CognitoIdentityServiceProvider.CognitoUserPool(poolData);
var authData = {
Username: params.Email,
Password: params._password
};
var authDetails = new aws.CognitoIdentityServiceProvider.AuthenticationDetails(authData);
var userData = {
Username: params.Email,
Pool: userPool
};
var cognitoUser = new aws.CognitoIdentityServiceProvider.CognitoUser(userData);
cognitoUser.authenticateUser(authDetails, {
onSuccess: function(result)
{
callback(null, {success: true, data: result});
},
onFailure: function(err)
{
console.log('authUser error: ' + util.inspect(err));
callback(err);
}
});
}
我现在成功获得了令牌回复!万岁!
答案 1 :(得分:0)
只需通过AWS设置身份验证凭证并使用config选项。
const settings = Settings.GetSettings('Cognito');
const auth = {
region: settings['region'],
apiVersion: settings['api-version'],
accessKeyId: settings['access-key-id'],
secretAccessKey: settings['secret-access-key']
};
const CognitoIdentityServiceProvider = new AWS.CognitoIdentityServiceProvider(auth);
var config = {
UserPoolId: settings['user-pool-id'],
Username: guid
};
CognitoIdentityServiceProvider.adminDeleteUser(config, function (err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});