9

我正在尝试使用带有用户池的 AWS Cognito 通过我的 API 进行身份验证。我有一个通过 AWS Cognito 用户池创建的用户,我正在尝试使用该用户登录。

我得到的错误是CredentialsError: Missing credentials in config. 具体来说,它告诉我我需要一个IdentityPoolId. 但我似乎无法IdentityPoolId在我的 AWS 控制台中找到它。我的用户池从哪里得到这个?我看到的只是一个 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

在此处输入图像描述

我通过输入and为该用户池将Authentication Providerfor关联Cognito到我创建的用户池。现在使用相同的代码,我得到了错误。它说。好的...我正在尝试授权用户...我是否需要创建一个未经身份验证的角色,以便用户在未经身份验证时可以进行身份​​验证?如果那是我需要做的,那似乎很愚蠢。User Pool IDApp Client IDIdentity pool IDCredentialsError: Missing credentials in configUnauthorized access is not supported for this identity pool

编辑2:

我还应该注意,我能够登录并获得以及AccessToken使用Javascript SDK(不是 nodejs)。我在不需要. 我唯一需要的是 a和 a 。IdTokenRefreshTokenIdentityPoolIdUserPoolIdClientId

var authenticateUser = function(onSuccessCallback)
{
    var authData = {
        Username: getUserName(), // gets username from an html text field
        Password: getPassword()  // gets password from an html password field
    };

    var authDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authData);

    var cognitoUser = getCognitoUser();

    cognitoUser.authenticateUser(authDetails,
    {
        onSuccess: function(result)
        {
            console.log('access token: ' + result.getAccessToken().getJwtToken());
            console.log('idToken: ' + result.idToken.jwtToken);
            console.log(result);

            if (onSuccessCallback && typeof(onSuccessCallback) == 'function')
            {
                onSuccessCallback(cognitoUser);
            }
        },
        onFailure: function(err)
        {
            // UserNotConfirmedException: User is not confirmed.
            console.log('authError');
            alert(err);
        }
    });
}
4

2 回答 2

7

事实证明,这initiateAuth根本不是我想做的。我还缺少一个名为amazon-cognito-identity-js. 安装后我更新了我的代码如下:

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);
        }
    });
}

我现在成功地得到了带有令牌的响应!万岁!

于 2017-04-05T17:20:35.867 回答
2

只需使用 AWS 设置身份验证凭证并使用配置选项。

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);
  }
});
于 2019-04-23T22:18:27.167 回答