AWSS3PresignedURLErrorDomain,iOS,AWSSDK v2

时间:2015-02-15 04:02:51

标签: ios amazon-web-services amazon-s3

在iOS 8中使用AWSSDK V2,完成了示例代码库和设置 cognito可以正确访问我的S3Bucket。以下示例

https://github.com/awslabs/aws-sdk-ios-samples/tree/master/S3BackgroundTransfer-Sample/Objective-C

当我尝试上传时,我收到此错误

Error: Error Domain=com.amazonaws.AWSS3PresignedURLErrorDomain Code=1   
"accessKey in credentialProvider can not be nil" UserInfo=0x7d905610 
{NSLocalizedDescription=accessKey in credentialProvider can not be nil}

我确保cognito poold id使用的角色可以根据我为其创建的策略访问我的s3存储桶。可能是什么问题?

Agfter sebastians commnent,我回去确认我正在使用未经身份验证的用户,其角色可以访问我的s3bucket,然后查看他对Cognito异步及其初始化的最后评论。我在这个方法中这样做

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

AWSCognitoCredentialsProvider *credentialsProvider = [AWSCognitoCredentialsProvider credentialsWithRegionType:CognitoRegionType
                                                                                               identityPoolId:CognitoIdentityPoolId];
AWSServiceConfiguration *configuration = [AWSServiceConfiguration configurationWithRegion:DefaultServiceRegionType
                                                                      credentialsProvider:credentialsProvider];
[AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;

// Override point for customization after application launch.
return YES;
}

现在在破线时

 [AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;

并在调试器中检查credentialsProvider的属性,它确实有很多nil属性!!

 credentialsProvider    AWSCognitoCredentialsProvider * 0x7886a0d0  0x7886a0d0
 NSObject   NSObject        
 _useEnhancedFlow   BOOL    YES '\x01'
 _identityId    NSString *  nil 0x00000000
 _accessKey NSString *  nil 0x00000000
 _secretKey NSString *  nil 0x00000000
 _sessionKey    NSString *  nil 0x00000000
 _expiration    NSDate *    nil 0x00000000

我确实创建了实体池并在我的代码中嵌入了ID,我应该在这里查找什么?

3 个答案:

答案 0 :(得分:1)

我有完全相同的问题,但上面的答案也没有帮助我。

<强>更改

let CognitoRegionType = AWSRegionType.Unknown
let DefaultServiceRegionType = AWSRegionType.Unknown

let CognitoRegionType = AWSRegionType.EUWest1
let DefaultServiceRegionType = AWSRegionType.EUWest1

Constants.swift 中为我解决了这个问题。当然,这是在上面提到的示例应用程序的上下文中。

答案 1 :(得分:0)

从上面的错误看,您的CognitoCredentialsProvider看起来没有访问密钥/密钥。

将Cognito与经过身份验证的用户一起使用时,仅创建IdentityPool并创建AWSCognitoCredentialsProvider实例是不够的。

您必须编写代码来验证您的用户。目前,Cognito支持使用Amazon,Facebook,Google,任何通用OpenID Connect或您自己的后端进行用户身份验证。

从身份提供商处收到身份验证令牌后,您可以将其提供给Cognito(使用其.logins属性),然后Cognito会将该令牌交换为有效的访问密钥和密钥。

您的Cognito Identity提供商似乎还没有访问密钥/密钥。您上面链接的示例是未经身份验证的用户的Cognito使用示例 - 可能对您的应用程序有效。根据您的使用情况而定。

另请注意,CognitoIdentitProvider类是异步的(与所有AWS iOS SDK类一样)。确保在Cognito完全初始化之前没有调用S3 Transfer Manager类。

为了更好地了解Cognito Identity,我邀请您阅读http://docs.aws.amazon.com/mobile/sdkforios/developerguide/cognito-auth.html

答案 2 :(得分:0)

经过多次检查,我发现了问题(缺少文档)。 我需要为cognito使用的角色创建一个在线策略。何时去IAM服务 - &gt;角色 - &gt;点击角色 - &gt;权限,在该选项卡下有两种类型的托管和内联策略,在我设置一个没有做任何事情的托管策略之前,所以我回过头来创建一个内联策略,这就是我给这个角色访问S3桶的地方,现在它有效!!

希望这有助于其他人,并且AWS确实需要更好地记录。