使用STS凭证授权AWS -无需会话令牌


Authorise AWS with STS credentials - without session token

我正在使用Titanium开发iOS应用程序。部分应用程序需要将照片直接上传到S3。现在我不想把主要的AWS凭证放在这里,所以我使用安全令牌服务来生成一些临时凭证。那部分工作得很好

如果有帮助,下面是生成凭据的代码:

$sts = StsClient::factory(array(
    'key'    => 'KEY_HERE',
    'secret' => 'SECRET_HERE'
));
$result = $sts->getSessionToken();

在其他事情中,我得到了AccessKeyId, SecretAccessKey &SessionToken。通过所有3这些通过PHP工作很棒,我可以上传好。但是,我随后将这些凭据传递给应用程序,并需要从那里使用它们。

问题是连接到AWS的每种方法(包括"官方"AWS模块)只使用访问密钥&秘密密钥-即没有办法传递会话令牌,因此我无法授权。例如,Titanium AWS模块像AWS.authorize(accessKey, secretKey);一样工作-它不接受会话令牌。

现在,我真正的问题是-我如何与一个密钥/秘密连接并让它被接受。我需要设置一些配置吗?我是否需要破解模块以某种方式传递令牌?我对AWS的世界很陌生,所以有些事情仍然很令人困惑,任何指导都将是非常感谢的!

这是AWS iOS SDK文档中的示例链接。它们初始化对象名称AmazonCredentials(其中包含密钥、访问密钥和会话令牌),然后使用AmazonCredentials初始化AmazonS3Client。

https://github.com/awslabs/aws-sdk-ios-samples/blob/master/S3_SimpleDB_SNS_SQS_DemoTVM/AWSiOSDemoTVM/Classes/AmazonClientManager.m

AmazonCredentials *credentials = [AmazonKeyChainWrapper getCredentialsFromKeyChain];
[s3 release];
s3  = [[AmazonS3Client alloc] initWithCredentials:credentials];
s3.endpoint = [AmazonEndpoints s3Endpoint:US_WEST_2];

另一个选项是使用IAM生成一个只允许将文件上传到S3的用户。该用户获得自己的访问密钥和秘密,您可以将其与应用程序一起发布。

如果我没记错的话,AWS在4月份取消了对新账户使用主凭据,所以无论如何,熟悉IAM是一个很好的选择!