2016-05-10 12 views
2

後、私は開発者認証アイデンティティとバックエンドとしてAWSを使用してのiOS(スウィフト)アプリを構築しています。アプリを閉じるまでしばらく放置してから再起動してください。このシナリオでは、AWSからデータを取得しようとするとExpiredTokenExceptionエラーが発生することがありますが、必ずしもそうではありません。ここでAWS ExpiredTokenExceptionは、アプリのリニューアル

が私のコードです:

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

    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 { 
      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 apiUrl = "https://url-goes-here" // call my server to retrieve an OpenIdToken 
     request.GET(apiUrl, parameters: nil, progress: nil, 
      success: { 
       (task: NSURLSessionDataTask, response: AnyObject?) -> Void in 

       let tmp = NSMutableDictionary() 
       tmp.setObject("temp", forKey: "ExampleApp") 
       self.logins = tmp as [ NSObject : AnyObject ] 

       let jsonDictionary = response as! NSDictionary 
       self.identityId = jsonDictionary["identityId"] as! String 
       self._token = jsonDictionary["token"] as! String 
       awstask.setResult(response) 
      }, 
      failure: { 
       (task: NSURLSessionDataTask?, error: NSError) -> Void in 

       awstask.setError(error) 
      } 
     ) 

     return awstask.task 
    } 
} 

そしてAppDelegateで:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    let identityProvider = DeveloperAuthenticatedIdentityProvider() 

    // set default service configuration 
    let credentialsProvider = AWSCognitoCredentialsProvider(regionType: cognitoRegion, identityProvider: identityProvider, unauthRoleArn: unauthRole, authRoleArn: authRole) 
    let configuration = AWSServiceConfiguration(region: defaultServiceRegion, credentialsProvider: credentialsProvider) 
    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration 

    // set service configuration for S3 (my bucket is located in a different region to my Cognito and Lambda service) 
    let credentialsProviderForS3 = AWSCognitoCredentialsProvider(regionType: cognitoRegion, identityProvider: identityProvider, unauthRoleArn: unauthRole, authRoleArn: unauthRole) 
    let awsConfigurationForS3 = AWSServiceConfiguration(region: s3ServiceRegion, credentialsProvider: credentialsProviderForS3) 
    AWSS3TransferUtility.registerS3TransferUtilityWithConfiguration(awsConfigurationForS3, forKey: "S3") 

    return true 
} 

このpost Cognitoトークンの有効期限が切れていると、それは手動で更新するには、開発者次第であることを示唆しています。これは、定期的にリフレッシュするタイマーの設定、アプリケーションのクロージャと再起動の処理、リフレッシュ中に発生するAWSリクエストの処理を必要とするため、複雑すぎるようです。もっと簡単な方法はありますか?たとえば、有効期限が切れたトークンを使用してサーバーに照会しようとするたびに、AWS SDKに自動的に更新を呼び出させることは可能ですか?

ご協力いただければ幸いです。私はiOS用のAWS SDKのバージョン2.3.5を使用しています。

答えて

1

のiOS 2.4.xのためのAWSモバイルSDKがAWSIdentityProviderManagerと呼ばれる新しいプロトコルを持っています。これは、次の方法があります。

/** 
* Each entry in logins represents a single login with an identity provider. 
* The key is the domain of the login provider (e.g. 'graph.facebook.com') and the value is the 
* OAuth/OpenId Connect token that results from an authentication with that login provider. 
*/ 
- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins; 

このプロトコルに準拠したオブジェクトの責任は、それが要求されるたびに、有効なlogins辞書を返すことです。このメソッドは非同期であるため、キャッシュされたトークンが期限切れになっていれば、ネットワーキング・コールを行うことができます。実装は、あなた次第ですが、多くの場合、AWSIdentityProviderManagerは、複数のAWSIdentityProvider Sを管理し、それらを集約し、logins辞書を返します。

+0

ありがとうございました@ヨースケ松田。代わりにユーザープールを実装することに決めました。しかし、私はその仕事を得るのに苦労し、関連する質問[ここ](http://stackoverflow.com/questions/37176334/aws-cognito-user-pools-in-ios-swift-app)を投稿しました。 – Elliot

0

残念ながらトークンをリフレッシュ開発者が唯一の方法です。

私はAWS SDKはこれを取り扱わなく、CrdentialsProviderが設計された方法は、すべてのプロバイダのための一般的なことになっている場合、それはアプリ開発者のために簡単になることに同意します。たとえば、誰かがFacebookをプロバイダとして使用したい場合、AWS SDKは独自のリフレッシュを処理できず、開発者は自分のアプリでそれを処理しません。 SDKのリフレッシュフローを維持することで、CredentialsProviderを汎用的に保つことができます。

+0

ありがとうございます。 OpenIdトークンではなく、Cognitoトークンが期限切れになっていることを理解していますか?その場合、Cognitoトークンが期限切れになったことをCredentials Providerが検出して自動的にrefresh()を呼び出すことができませんでしたか? FacebookがOpenIdトークンを提供していたとしても、これはうまくいかないでしょうか? – Elliot

+0

「Cognitoトークンは」ここにあなたがあなたのバックエンドからGetOpenIdTokenForDeveloperIdentityのAPIを呼び出すときにCognitoで販売さトークンです。 CredentialsProviderの場合、このトークンはFBのアクセストークンと同等です。 –

関連する問題