Наш основной поток приложений выглядит следующим образом:
Реагирует приложение: пользователь входит в систему ---> проходит аутентификацию с использованием cognito ->, а затем перенаправляется на портал, где они могут загружать файлы в s3
Структура «папок» в s3 выглядит следующим образом: электронная почта для каждого пользователя имеет папку / ключ в корзине s3 (давайте назовем эту корзину «testbucket»).
Так что, если мой адрес электронной почты будет john@google.com, он будет выглядеть следующим образом: Bucket - testbucket, key - john@google.com
И john может загружать только в эту папку.
Теперь мой вопрос: сейчас я проверяю, существует ли «ключ», если нет, отклонить запрос к s3.Однако, с добавленным уровнем KMS, я хочу знать, передам ли я "главный ключ" kms при выполнении запроса в узле?Если да, то я просто сохраню ключ в переменной env и передам его при вызове?
Кроме того, могу ли я добавить в политику что-то, связывающее доступ к cognito или к электронной почте пользователя, которая аутентифицирована?Если да, могу ли я получить пример, как это сделать?(как реализовать пример политики)
edit 1: пользователь политики
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::mybucket"
],
"Condition": {
"StringLike": {
"s3:prefix": [
"cognito/users/"
]
}
}
},
{
"Effect": "Deny",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListObject"
],
"Resource": [
"arn:aws:s3:::mybucket/cognito/users/${cognito-identity.amazonaws.com:sub}",
"arn:aws:s3:::mybucket/cognito/users/${cognito-identity.amazonaws.com:sub}/*"
]
}
]
}
edit 2: пересмотренная политика
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::mybucket"
],
"Condition": {
"StringLike": {
"s3:prefix": [
"cognito/users/"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::mybucket/cognito/users/${cognito-identity.amazonaws.com:sub}",
"arn:aws:s3:::mybucket/cognito/users/${cognito-identity.amazonaws.com:sub}/*"
]
}
]
}
Затем я делаю вызов API следующим образом:
var authenticate = (val) => {
var userData = {
Username: val.user, // your username here
Pool: userPool
};
var authenticationData = {
Username: val.user, // your username here
Password: val.pass, // your password here
};
var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: function(result) {
var accessToken = result.getAccessToken().getJwtToken();
var idtoken = result.getIdToken().getJwtToken();
var params = {
IdentityPoolId: 'ca-central-1:****',
Logins: {
'cognito-idp.ca-central-1.amazonaws.com/****': result.getIdToken().getJwtToken()
}
}
var cognitoidentity = new AWS.CognitoIdentity();
cognitoidentity.getId(params, function(err, data) {
if (err) console.log(err);
else {
var id = data.IdentityId;
console.log(id);
var params = {
Bucket: 'mybucket',
Key: `cognito/users/${id}/image.jpg`
};
s3.getObject(params, function(err, data) {
if (err) console.log(err, err.stack);
else console.log(data);
});
}
});
},
onFailure: function(err) {
console.log("---------")
console.log(`this is ${JSON.stringify(err)}`);
}
});
}
Последнее редактирование:
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: function(result) {
var accessToken = result.getAccessToken().getJwtToken();
var idtoken = result.getIdToken().getJwtToken();
var params = {
IdentityPoolId: 'ca-central-1:***',
Logins: {
'cognito-idp.ca-central-1.amazonaws.com/***': result.getIdToken().getJwtToken()
}
}
var cognitoidentity = new AWS.CognitoIdentity();
cognitoidentity.getId(params, function(err, data) {
if (err) console.log(err);
else {
// console.log(data);
var id = data.IdentityId;
console.log(id);
var params = {
IdentityId: `${id}`,
Logins: {
'cognito-idp.ca-central-1.amazonaws.com/***': result.getIdToken().getJwtToken()
}
};
cognitoidentity.getCredentialsForIdentity(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else {
// console.log(data); // successful response
var creds = new AWS.Credentials({
accessKeyId: `${data.Credentials.AccessKeyId}`,
secretAccessKey: `${data.Credentials.secretAccessKey}`,
sessionToken: `${data.Credentials.SessionToken}`
})
var s3 = new AWS.S3(creds);
console.log(creds);
var params = {};
s3.listBuckets(params, function(err, data) {
if (err) console.log(err, err.stack);
else console.log(data);
});
}
});
}
});