AWS IOS SDK身份验证

时间:2015-05-26 21:47:09

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

我是ios开发的新手,我正在尝试将AWS集成到用Swift编写的移动应用程序中。我使用以下代码连接并上传文件到s3:

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。但它是通过unauth角色这样做的,我已经给出了" 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应该是我获得授权令牌的地方吗?如果是的话,会在哪里?

感谢任何帮助

2 个答案:

答案 0 :(得分:1)

如果您想要对您的用户进行身份验证,您可以使用Facebook,Google等公共身份提供商...或者您可以使用 Amazon Cognito用户池。您可以在 Amazon Cognito identity pool 中将您的身份提供商(Facebook,Google,或Amazon Cognito用户池)指定为身份验证提供商

例如,假设您要为您的身份池提供亚马逊认知用户池作为身份验证提供程序。请参阅此链接以了解如何将 Amazon Cognito用户池与Amazon身份池集成。

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

它在Xcode 8swift 3中为我工作。

感谢。 :)

答案 1 :(得分:0)

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

谢谢,
Rachit