पर आधारित एस 3 फ़ोल्डर पहुंच के लिए आईएएम नीति मैंने कॉग्निटो उपयोगकर्ताओं को मेरी एस 3 बाल्टी में लिखने की अनुमति देने के लिए आईएएम नीति बनाई है, लेकिन मैं उन्हें अपने कॉग्निटो आईडी के आधार पर फ़ोल्डर में प्रतिबंधित करना चाहता हूं। मैं अमेज़न के निर्देश here पीछा किया और एक नीति है कि इस तरह दिखता है बना लिया है:कॉग्निटो आईडी
{
"Effect": "Allow",
"Action": ["s3:PutObject","s3:GetObject"],
"Resource": [
"arn:aws:s3:::mybucket/myappfolder/${cognito-identity.amazonaws.com:sub}*"
]
}
लेकिन जब मैं एडब्ल्यूएस iOS SDK का v2 का उपयोग कर अपलोड करने की कोशिश मैं एक पहुँच से मना कर त्रुटि मिलती है।
यदि मैं ${cognito-identity.amazonaws.com:sub}
को identityId
मान के साथ संसाधन के अंतिम पथ घटक को संशोधित करने के लिए संशोधित करता हूं तो मैं एसडीके के AWSCognitoCredentialsProvider
से काम कर रहा हूं।
{
"Effect": "Allow",
"Action": ["s3:PutObject","s3:GetObject"],
"Resource": [
"arn:aws:s3:::mybucket/myappfolder/us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx*"
]
}
मेरे समझ थी कि इन एक ही बात करने के लिए समानता चाहिए। मैं अपने नीति में कुछ याद आ रही है, या मैं अपने अपलोड अनुरोध में एक अलग पथ का उपयोग किया जाना चाहिए?
** अद्यतन **
मैं मूल रूप से आईओएस में इस समस्या है, तो आज रात मैं Node.js में ही बात कर की कोशिश की और परिणाम समान है था। यहाँ सरल कोड मैं नोड में उपयोग कर रहा हूँ है:
var s3 = new AWS.S3();
AWS.config.region = 'us-east-1';
AWS.config.credentials = new AWS.CognitoIdentityCredentials(AWSParams);
AWS.config.credentials.get(function (err) {
if (!err) {
console.log("Cognito Identity Id: " + AWS.config.credentials.identityId);
var bucketName = 'ch123_test_bucket';
var keyName = AWS.config.credentials.identityId + '.txt';
var params = {Bucket: bucketName, Key: keyName, Body: 'Hello World!'};
s3.putObject(params, function (err, data) {
if (err)
console.log(err)
else
console.log("Successfully uploaded data to " + bucketName + "/" + keyName);
});
}
और मैं एक ही परिणाम है कि मैं iOS के साथ मिल मिलती है: जब तक कि मैं IAM नीति में स्पष्ट cognito आईडी आपूर्ति एपीआई 403
के साथ प्रतिक्रियामैं बहुत न्यूनतम करने के लिए नीचे मेरी IAM नीति छीन लिया है। यह काम नहीं करता:
{
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:PutObject","s3:GetObject"],
"Resource": [
"arn:aws:s3:::ch123_test_bucket/${cognito-identity.amazonaws.com:sub}*"
]
}
]
}
यह करता है:
{
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:PutObject","s3:GetObject"],
"Resource": [
"arn:aws:s3:::ch123_test_bucket/us-east-1:68a5dc49-6cc7-4289-8257-d3d5636f7034*"
]
}
]
}
मैं नहीं दिख रहा है मैं यहाँ क्या याद कर रहा हूँ ... केवल प्रलेखन मैं हमेशा ढूँढने में सक्षम किया गया है पता चलता वही उदाहरण संसाधन मान जो मैं उपयोग कर रहा हूं।
बस स्पष्ट होने के लिए, आपके द्वारा शामिल पहली नीति दूसरे से मेल नहीं खाती है। क्या आप वाकई वही हैं? क्या आप अपने ऐप में उपयोग कर रहे कोड को शामिल कर सकते हैं? क्या आप ट्रांसफर मैनेजर का उपयोग कर रहे हैं? –
@BobKinney मैंने समस्या का वर्णन करने के लिए एक साधारण node.js उदाहरण दिखाने के लिए अपना प्रश्न अपडेट किया है। – ChrisH
@ChrisH, अपने विस्तृत प्रश्न के लिए धन्यवाद। मेरे पास सिर्फ एक टिप्पणी और एक सवाल है। मेरे टिप्पणी: इस लाइन 'वर S3 = नए एडब्ल्यूएस।एस 3(); 'क्रेडेंशियल सेट करने के बाद होना चाहिए (तीसरी पंक्ति में), अन्यथा, त्रुटियां घटित होंगी। और, सवाल यह है कि: आपने जो लिखा है वह अनधिकृत उपयोगकर्ताओं के लिए है, आप प्रमाणित लोगों के लिए ऐसा कैसे करेंगे? धन्यवाद! – securecurve