2015-11-05 39 views
0

我已根據this AWS Developer Guide初始化憑證提供程序。我不確定它是否有效,以及如何檢查。我似乎無法找到關於如何在Swift中使用Cognito的任何文檔。調試屬性identityProvider.identityId是nil時如何使用Swift獲取未經身份驗證的標識

identityId <AWSTask: 0x17d5fde0; completed = NO; cancelled = NO; faulted = NO;>

然而,:我運行它作爲一個單元測試,並且測試通過,並且線print("identityId", identityId)輸出。

這裏是我的文件:

// MyAuth.swift 

import Foundation 
import AWSCognito 

class MyAuth { 

    func getUnauthCognitoId()->Bool { 
     let identityProvider = MyIdentityProvider() 
     let credentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USEast1, identityProvider: identityProvider, unauthRoleArn: Constants.ARNUnauth.value, authRoleArn: Constants.ARNAuth.value) 
     let defaultServiceConfiguration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: credentialsProvider) 
     AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration 

     if let identityId = identityProvider.getIdentityId() { 
      print("identityId", identityId) 
      return true 
     } else { 
      return false 
     } 

    } 

} 

而且

// MyIdentityProvider.swift 

import Foundation 
import AWSCognito 

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

    // Header stuff you may not need but I use for auth with my server 
    /*let acceptHeader = "application/vnd.exampleapp-api+json;version=1;" 
    let authHeader = "Token token=" 
    let userDefaults = NSUserDefaults.standardUserDefaults() 
    let authToken = self.userDefaults.valueForKey("authentication_token") as String*/ 

    // End point that my server gives amazon identityId and tokens to authorized users 
    let url = "https://api.myapp.com/api/amazon_id/" 

    func authenticatedWithProvider()->Bool { 
     if let logins = _logins { 
      return logins["ProviderName"] == nil 
     } 
     else { 
      return false 
     } 
    } 

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

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

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

    override func refresh() -> AWSTask! { 
     let task = AWSTaskCompletionSource() 
     if(!self.authenticatedWithProvider()) { 
      return super.getIdentityId() 
     } 
     else { 
      // TODO: Authenticate with developer 
      return task.task 
     } 
     /*let request = AFHTTPRequestOperationManager() 
     request.requestSerializer.setValue(self.acceptHeader, forHTTPHeaderField: "ACCEPT") 
     request.requestSerializer.setValue(self.authHeader+authToken, forHTTPHeaderField: "AUTHORIZATION") 
     request.GET(self.url, parameters: nil, success: { (request: AFHTTPRequestOperation!, response: AnyObject!) -> Void in 
      // The following 3 lines are required as referenced here: http://stackoverflow.com/a/26741208/535363 
      var tmp = NSMutableDictionary() 
      tmp.setObject("temp", forKey: "ExampleApp") 
      self.logins = tmp 

      // Get the properties from my server response 
      let properties: NSDictionary = response.objectForKey("properties") as NSDictionary 
      let amazonId = properties.objectForKey("amazon_identity") as String 
      let amazonToken = properties.objectForKey("token") as String 

      // Set the identityId and token for the ExampleAppIdentityProvider 
      self.identityId = amazonId 
      self._token = amazonToken 

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

而且

import XCTest 
@testable import My 

class MyTests: XCTestCase { 

    override func setUp() { 
     super.setUp() 
     // Put setup code here. This method is called before the invocation of each test method in the class. 
    } 

    override func tearDown() { 
     // Put teardown code here. This method is called after the invocation of each test method in the class. 
     super.tearDown() 
    } 

    func testExample() { 
     // This is an example of a functional test case. 
     // Use XCTAssert and related functions to verify your tests produce the correct results. 
    } 

    func testPerformanceExample() { 
     // This is an example of a performance test case. 
     self.measureBlock { 
      // Put the code you want to measure the time of here. 
     } 
    } 

    func testGetUnauthCognitoId() { 
     let myAuth = MyAuth() 
     XCTAssertTrue(myAuth.getUnauthCognitoId()) 
    } 

} 
+0

看起來身份證號碼對我無效。在這個[頁面](https://github.com/aws/aws-sdk-ios/blob/master/AWSCoreTests/AWSCognitoIdentityServiceTests.m)上有一些有趣的示例可以讓iOS中的憑證提供者工作。他們也有一些有趣的預構建測試用例。我簡短地看了一下,提供的頁面似乎與您的問題有關。順便說一句 - 如果你只想從回購下載單個文件夾,請查看此SO [Q&A](http://stackoverflow.com/questions/7106012/download-a-single-folder-or-directory-from-a- github-repo/32545187#32545187) –

+0

編輯:我編輯了我更改過的代碼,特別是我實現了一個AWSAbstractCognitoIdentityProvider,並且不確定它是否成功檢索到標識。 – JBaczuk

+0

順便說一句 - 你在設備上運行它? –

回答

0

事實證明,如果你創建的應用程序中的默認服務配置:在您的應用程序代理文件申請的委託方法:中:didFinishLaunchingWithOptions

let credentialsProvider = AWSCognitoCredentialsProvider(
     regionType: AWSRegionType.USEast1, identityPoolId: cognitoIdentityPoolId) 

let defaultServiceConfiguration = AWSServiceConfiguration(
     region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider) 

AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration 

的SDK將使用未經認證身份,只要您嘗試使用任何AWS服務,並且您不一定需要創建cognitoIdentity對象。

0

getIdentityId返回AWSTask。由於AWSTask本質上是BFTask,因此可以使用continueWithBlock syntax shown on the BFTask page來獲取身份標識。喜歡的東西:

credentialProvider.getIdentityId().continueWithBlock { 
    (task: AWSTask!) -> AWSTask in 
    if task.error() { 
     // failed to retrieve identityId. 
    } else { 
     print("identityId", task.result()) 
    } 
+0

這是有道理的,但它可以單元測試(因爲它是異步代碼),如果是這樣,如何? – JBaczuk

+0

我想我想出瞭如何使用這篇文章:http://blog.dadabeatnik.com/2014/07/13/asynchronous-unit-testing-in-xcode-6/ – JBaczuk

+0

是的,通常單元測試框架將有一個方法處理異步代碼。這在iOS中尤其如此,因爲所有的網絡調用都應該是非常好的。我用過獼猴桃,他們有一些關於此的文檔在https://github.com/kiwi-bdd/Kiwi/wiki/Asynchronous-Testing –

相關問題