2017-10-17 106 views
1

我正在嘗試編寫一個簡單的JavaScript(在瀏覽器中運行),它將通過describeApplications函數獲取有關我的Beanstalk應用程序的信息。我創建了具有未經身份驗證的訪問複選框集的Cognito身份池,並將AWSElasticBeanstalkReadOnlyAccess策略附加到身份池的角色。使用Cognito對AWS服務的未經身份驗證的訪問

下面是代碼:

<script src="https://sdk.amazonaws.com/js/aws-sdk-2.134.0.min.js"></script> 
<script> 
    AWS.config.region = 'eu-west-1'; // Region 

    AWS.config.credentials = new AWS.CognitoIdentityCredentials({ 
     IdentityPoolId: 'eu-west-1:....', 
    }); 

    var elasticbeanstalk = new AWS.ElasticBeanstalk(); 
    elasticbeanstalk.describeApplications({}, function (err, data) { 
     if (err) { 
      console.log(err); 
      console.log(err.stack); 
     } else { 
      console.log(data); 
     } 
    }); 

這裏是控制檯輸出:

{ResponseMetadata: {…}, Applications: Array(0)} 

應用陣列是空的!但我在歐盟西部地區肯定有應用。

爲了做一個簡單的測試,我創建了一個用戶,附着相同的策略和硬編碼的用戶憑據,而不是CognitoIdentityCredentials:

<script src="https://sdk.amazonaws.com/js/aws-sdk-2.134.0.min.js"></script> 
<script> 
    AWS.config.region = 'eu-west-1'; // Region 

    AWS.config.accessKeyId = '...'; 
    AWS.config.secretAccessKey = '...'; 

    var elasticbeanstalk = new AWS.ElasticBeanstalk(); 
    elasticbeanstalk.describeApplications({}, function (err, data) { 
     if (err) { 
      console.log(err); 
      console.log(err.stack); 
     } else { 
      console.log(data); 
     } 
    }); 

瞧,我看到我的魔豆的應用:

{ResponseMetadata: {…}, Applications: Array(1)} 

我做過其他測試。我試圖列出S3 bucket with unauth。訪問和Cognito - 它也可以。這意味着我的不道德。角色被正確地附加和應用。但我不知道,爲什麼我看不到豆莢裏的應用程序!

我在做什麼錯誤的未經認證的訪問和Cognito?任何幫助將非常感激!

更新!

感謝Mike Patrick指出正確的方向! https://stackoverflow.com/a/46820122/1858818

我切換到基本認證流程,就是這樣。這裏是工作的代碼:

AWS.config = { 
    apiVersions: { elasticbeanstalk: '2010-12-01' }, 
    region: 'eu-west-1', 
    credentials: new AWS.WebIdentityCredentials({ 
     RoleArn: 'my role arn' 
    }) 
};    

var cognitoidentity = new AWS.CognitoIdentity(), 
    elasticbeanstalk = new AWS.ElasticBeanstalk(); 

var params = { 
    IdentityPoolId: 'my cognito identity pool id', /* required */ 
}; 
cognitoidentity.getId(params, function(err, data) { 
    if (err){ 
     console.log(err, err.stack); // an error occurred 
    } else { 
     var params = { 
      IdentityId: data.IdentityId 
     }; 
     cognitoidentity.getOpenIdToken(params, function(err, data) { 
      if (err) { 
       console.log(err, err.stack); // an error occurred 
      } else { 

       AWS.config.credentials.params.WebIdentityToken = data.Token; 

       //here we go, elasticbeanstalk functions work as expected 

      } 
     });   
    } 
}); 
+1

您對該角色的IAM策略是什麼樣的?看起來你可能在'Resource'的某處丟失了一個通配符。 – arjabbar

+0

這是缺省AWS策略AWSElasticBeanstalkReadOnlyAccess,其中「Resource」爲「*」。爲測試用戶和認證角色附加相同的策略。 –

+0

事實上,你看到一個響應,儘管它有一個空的數組,這是一個跡象表明它正在工作。否則,你會看到一個異常。雙重和三重檢查區域? – jarmod

回答

1

我不相信你做錯了什麼;我也無法完成這項工作。我懷疑你可能是亞馬遜「保護」自己的受害者。

http://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html下「訪問策略」:

對於額外的安全保護,亞馬遜Cognito施加 範圍下鄉政策由GetCredentialForIdentity販賣憑據 防止對未經認證的訪問除這些其他服務 用戶

...服務清單不包括青苗彈性...

如果您需要爲您的 未經身份驗證的用戶訪問除這些服務以外的其他內容,則必須使用基本身份驗證流程。

這似乎表明,無論您將哪種策略附加到Cognito Unauthenticated角色,AWS都會「縮小範圍」。

如果是這種情況,你會看到一些NotAuthorizedException(通常在響應標題)的證據,但我找不到任何。

相關問題