Ошибка Cognito AccessDenied с учетными данными, полученными из пула идентификаторов когнито (Javascript AWS SDK, регион cn-north-1)

Я уже больше суток пытаюсь заставить Cognito работать.

Наш сценарий, который я хочу запустить, - это «Аутентификация с помощью стороннего поставщика и доступ к сервисам AWS с помощью пула идентификации» на https://docs.amazonaws.cn/en_us/cognito/latest/developerguide/cognito-scenarios.html

В настоящее время я генерирую учетные данные с помощью AWS.EnvironmentCredentials, создаю новый CognitoIdentity и использую его для вызова getOpenIdTokenForDeveloperIdentity в нашем сервере.

AWS.config.credentials = new AWS.EnvironmentCredentials(...);
AWS.config.update({region: 'cn-north-1'});
const cognitoidentity = new AWS.CognitoIdentity({apiVersion: '2014-06-30'});

const params = {
  IdentityPoolId: 'cn-north-1:XXXXXX',
  Logins: {
    '<DeveloperProviderName>': identifierStr,
  },
};

Это работает нормально, и я могу получить необходимые token и identityId, которые я возвращаю на свой интерфейс. Там я обмениваю token и identityId на учетные данные.

AWS.config.region = 'cn-north-1';
const cognitoidentity = new AWS.CognitoIdentity({apiVersion: '2014-06-30'});
const params = {
  IdentityId: identityId,
  Logins: {
    'cognito-identity.cn-north-1.amazonaws.com.cn': token, //using the key for cn-north-1
  }
};

cognitoidentity.getCredentialsForIdentity(params, (err, data) => {
  if (err){
    //handle error
  } else { 
    //get credentials
    //using AccessKeyId and SecretKey and SessionToken to use AWS services
  }
});

Вот вылезу ошибку InvalidAccessKeyId: The AWS Access Key Id you provided does not exist in our records.

Почему я получаю эту ошибку? И как мне решить эту проблему?

Я думал, что мне может потребоваться изменить конфигурацию учетных данных для бэкэнда, как предлагает пример кода в пуле идентификаторов, но это дает ошибку Missing credentials in config на сервере.

// Initialize the Amazon Cognito credentials provider
AWS.config.region = 'cn-north-1'; // Region
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
  IdentityPoolId: 'cn-north-1:XXXXXXX',
});

изменить: после некоторого исследования я добавил SessionToken в конфигурации (дополнительно к AccessKey и SecretKey), но теперь получаю новую ошибку AccessDenied. Я проверил свои конфигурации ролей и тем не менее назначил правильные права своей аутентифицированной роли.


person turninglights    schedule 29.10.2019    source источник


Ответы (1)


Я нашел ответ и на свою вторую ошибку.

Мне не хватало правильной политики корзины (так как я пытаюсь получить доступ к S3). Политику корзины необходимо обновить с помощью

{
    "Version": "2012-10-17",
    "Id": "Policy01",
    "Statement": [
        {
            "Sid": "Statement01",
            "Effect": "Allow",
            "Principal": {
                "AWS": <IdentityPoolAuthenticatedRole>
            },
            "Action": [
                "s3:DeleteObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws-cn:s3:::<bucketName>/*" // <* or specified keyName>
        },
        ...
        // more statements
    ]
}

так что ведро знает, что запросы от них в порядке, насколько я понимаю.


Это сообщение в блоге помог мне встать на правильный путь, но предполагается, что вы настраиваете для неавторизованных пользователей, а не используете пулы идентификации.

person turninglights    schedule 29.10.2019