2015-05-26 137 views
0

我是新来的ios开发人员,我试图将AWS集成到Swift编写的移动应用程序中。我用下面的代码的文件连接并上传到S3:AWS IOS SDK身份验证

let credentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USEast1, identityPoolId: "us-east-1:xxxx") 
let serviceConfiguration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider) 
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = serviceConfiguration 

var uploadRequest = AWSS3TransferManagerUploadRequest() 
uploadRequest.bucket = "my-bucket" // Bucket where the file is uploaded 
uploadRequest.key = "myFile.txt" // The file's name on s3 
uploadRequest.body = getFileURL() // The file's path on my computer 

var transferManager = AWSS3TransferManager.defaultS3TransferManager() 
transferManager.upload(uploadRequest).continueWithBlock({ 
    (task: BFTask!) -> BFTask! in 
    if(task.error != nil){ 
     println("Couldn't upload the file"); 
     println(task.error.code) 
     println(task.error.localizedDescription) 
     } 
     return nil 
}) 

这做什么,我希望,它上传到MYFILE.TXT S3。但它是通过我赋予“s3:*”权限的未知角色这样做的。我想将这些操作限制为已认证的角色。在AWS的文档中,解决方案涉及使用Facebook,Twitter,亚马逊,谷歌等,或者使开发人员通过身份验证。

由于所有文档都在objective-c或java中,所以我很难制作开发人员身份验证标识。所以现在我试图寻找替代方案。是否可以使用accessKey,secretKey对进行身份验证?或者还有其他认证方式吗?

如果没有这种方式,我该如何实现开发人员身份验证身份?

class DevAuthProvider: AWSAbstractCognitoIdentityProvider{ 
var _token: String! 
var _logins: [NSObject : AnyObject ]! 
var someURL: String! 

override var token: String { 
    get { 
     return _token 
    } 
} 

override var logins: [NSObject : AnyObject]! { 
    get { 
     return _logins 
    } 
    set { 
     _logins = newValue 
    } 
} 

override func getIdentityId() -> BFTask! { 
    if self.identityId != nil { 
     return BFTask(result: self.identityId) 
    } 
    else{ 
     return BFTask(result: nil).continueWithBlock({ (task) -> AnyObject! in 
      if self.identityId == nil { 
       return self.refresh() 
      } 
      return BFTask(result: self.identityId) 
    }) 
    } 
} 

override func refresh() -> BFTask! { 
    let task = BFTaskCompletionSource() 
    let request = AFHTTPRequestOperationManager() 
    request.GET(someURL, parameters: nil, success: { (request: AFHTTPRequestOperation!, response: AnyObject!) -> Void in 
     var tmp = NSMutableDictionary() 
     tmp.setObject("temp", forKey: "App") 
     self.logins = tmp as [NSObject : AnyObject] 

     let properties: NSDictionary = response.objectForKey("properties") as! NSDictionary 
     let amazonId = properties.objectForKey("amazon_identity") as! String 
     let amazonToken = properties.objectForKey("token") as! String 

     self.identityId = amazonId 
     self._token = amazonToken 

     task.setResult(response) 
     }, failure: {(request: AFHTTPRequestOperation!, error: NSError!) -> Void in 
      task.setError(error) 
    }) 
    return task 
    }   
} 

我使用下面的代码作为一个开始,这个类的一个实例将被用来实例化一个AWSCognitoCredentialsProvider,但我不知道它是如何工作的,我应该如何使用它。具体来说,get请求中的URL应该是我获得授权令牌的权利?如果是这样,那会是什么?

任何帮助表示赞赏

回答

0

开发人员的身份验证功能需要你有不得不验证用户的凭据(用户名和密码)的能力的后端。你会注册你的用户到这个后端,然后用它来验证它们,然后出售你将从Cognito获得的令牌。移动应用程序将通过URL与此后端服务器进行通信。请参考我们的blog post,它有一个端到端的例子来设置一个后端和一个与后端交互的Objective-C样例。目前,我们在Swift中没有任何样本,但我们会将其作为功能请求。

感谢,
Rachit

+0

现在可以将后端替换为lamdba吗? – cdub

+1

是的,你可以使用Lambda。 –

1

如果你想你的用户进行身份验证您就可以使用Facebook,谷歌等公共身份提供者去...或者你可以用亚马逊Cognito用户池去。您可以指定您的身份提供商(Facebook,谷歌,..或亚马逊Cognito用户池)身份验证提供商亚马逊认知身份池

说例如,假设你要给亚马逊cognito用户池身份验证提供为您的身份池。请参阅此链接以探索如何将亚马逊认知用户池与Amazon身份池进行整合。

http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-integrating-user-pools-with-identity-pools.html

其在Xcode 8工作对我来说,swift 3

谢谢。 :)