後、私は開発者認証アイデンティティとバックエンドとして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を使用しています。
ありがとうございました@ヨースケ松田。代わりにユーザープールを実装することに決めました。しかし、私はその仕事を得るのに苦労し、関連する質問[ここ](http://stackoverflow.com/questions/37176334/aws-cognito-user-pools-in-ios-swift-app)を投稿しました。 – Elliot