2016-11-10 41 views
7

:意図したとおりにAWS:Cognito Poolに対してユーザーを正しく認証し、Cognito Federated Identityに使用するにはどうすればいいですか?私は2つの認証プロバイダを使用するアプリケーションに取り組んでいます

  • Facebookの
  • Cognitoユーザープール

元で、私は何の問題を持っていない、すべてが動作します。しかし、Cognito User Poolsを使って認証を設定するとき、私はもう一方の壁を突き当っています。私はAWS SDK 2.4.9、XCode 8、Swift 3を使用しています。

すでに多くの質問があり、そこには多くの "ガイド"があります。しかし、それらの多くは古くなったドキュメントやSDKのために回答/作成されています。公式のAWSドキュメントでも古くなっています。次のように

私が通過していた認証手順

は以下のとおりです。

設定1.初期cognitoプール

/// Set the default service configuration 
let serviceConfiguration = AWSServiceConfiguration(region: AWSRegionType.usEast1, credentialsProvider: nil) 
AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration 

/// Create a pool configuration and register it for a specific key to use later 
let poolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: appClientID, clientSecret: appClientSecret, poolId: poolID) 
AWSCognitoIdentityUserPool.registerCognitoIdentityUserPool(with: poolConfiguration, forKey: poolKey) 

/// Create a pool for a specific predefined key 
pool = AWSCognitoIdentityUserPool(forKey: poolKey) 

2. Cognitoユーザーのプールに対してユーザーを認証し

user.getSession(username, password: password, validationData: nil).continue({ (task) -> AnyObject? in 

     if let error = task.error as? NSError { 
      completionHandler(error) 
      return nil 
     } 

     let session = task.result! as AWSCognitoIdentityUserSession 
     let token = session.idToken!.tokenString 

     let tokens : [NSString:NSString] = ["cognito-idp.us-east-1.amazonaws.com/\(self.poolID!)" as NSString : token as NSString] 
     let identityProvider = CognitoPoolIdentityProvider(tokens: tokens) 

     let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .usEast1, identityPoolId: self.identityPoolID, identityProviderManager: identityProvider) 

     /// Set the default service configuration 
     let serviceConfiguration = AWSServiceConfiguration(region: AWSRegionType.usEast1, credentialsProvider: credentialsProvider) 
     AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration 

     credentialsProvider.getIdentityId().continue({ (task) -> AnyObject? in 
      completionHandler(task.error as NSError?) 
      return nil 
     }) 

     return nil 
    }) 

3. CognitoPoolIden tityProviderクラス

class CognitoPoolIdentityProvider : NSObject, AWSIdentityProviderManager { 

     var tokens : NSDictionary = [:] 

     init(tokens: [NSString : NSString]) { 
      self.tokens = tokens as NSDictionary 
     } 

     @objc func logins() -> AWSTask<NSDictionary> { 
      return AWSTask(result: tokens) 
     } 

    } 

4. Cognito連携アイデンティティにデータを保存する

このすべてがエラーなしで渡します。しかし、今私は、特定のCognito連携アイデンティティデータセットにCognitoプールから引っ張ってきたデータを保存したいので、私は呼び出しています:userProfile.synchronize().continueと私は次のような結果になっています:ログレベルを変更した後

getCredentialsWithCognito:authenticated:customRoleArn:]_block_invoke | GetCredentialsForIdentity failed. Error is [Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=8 "(null)" UserInfo={__type=NotAuthorizedException, message=Access to Identity 'us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' is forbidden.}]

2016-11-10 10:27:16.947365 xxxxxxxx[19867:5614838] AWSiOSSDK v2.4.11 [Error] AWSIdentityProvider.m line:304 | __52-[AWSCognitoCredentialsProviderHelper getIdentityId]_block_invoke.255 | GetId failed. Error is [Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=8 "(null)" UserInfo={__type=NotAuthorizedException, message=Unauthenticated access is not supported for this identity pool.}] 2016-11-10 10:27:16.947726 xxxxxxxx[19867:5614838] AWSiOSSDK v2.4.11 [Error]

AWSCredentialsProvider.m line:577 | __44-[AWSCognitoCredentialsProvider credentials]_block_invoke.352 | Unable to refresh. Error is [Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=8 "(null)" UserInfo={__type=NotAuthorizedException, message=Unauthenticated access is not supported for this identity pool.}] 2016-11-10 10:27:16.948452 xxxxxxxx[19867:5614838] AWSiOSSDK v2.4.11 [Error]

AWSCognitoDataset.m line:352 | __30-[AWSCognitoDataset syncPull:]_block_invoke | Unable to list records: Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=8 "(null)" UserInfo={__type=NotAuthorizedException, message=Unauthenticated access is not supported for this identity pool.} [10:27:16]: saveSettings AWS task error: The operation couldn’t be completed. (com.amazonaws.AWSCognitoIdentityErrorDomain error 8.)

を私は以下を見ることができます:

//REQUEST

2016-11-10 10:33:08.095735 xxxxxxxx[19874:5616142] AWSiOSSDK v2.4.11 [Debug] AWSURLSessionManager.m line:543 | -[AWSURLSessionManager printHTTPHeadersAndBodyForRequest:] | Request body: {"IdentityId":"us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx"}

//RESPONSE

2016-11-10 10:33:08.714268 xxxxxxxx[19874:5616154] AWSiOSSDK v2.4.11 [Debug] AWSURLSessionManager.m line:553 | -[AWSURLSessionManager printHTTPHeadersForResponse:] | Response headers: { Connection = "keep-alive"; "Content-Length" = 129; "Content-Type" = "application/x-amz-json-1.1"; Date = "Thu, 10 Nov 2016 09:33:08 GMT"; "x-amzn-ErrorMessage" = "Access to Identity 'us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx' is forbidden."; "x-amzn-ErrorType" = "NotAuthorizedException:"; "x-amzn-RequestId" = "b0ac6fb0-a728-11e6-8413-1fdb846185bb"; }

上記のリクエストはGetID APIコールです。明らかに、AWSドキュメントのリクエストフォーマット(http://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html)と一致しません。

AWSServiceManagerクラスによると、我々はこれを持っている:

/** 
The default service configuration object. This property can be set only once, and any subsequent setters are ignored. 
*/ 
@property (nonatomic, copy) AWSServiceConfiguration *defaultServiceConfiguration; 

これは、新しいサービス構成を設定することが無意味であることを意味するが、私はCognitoユーザープールを介して取得している資格情報を更新する他の方法を見ません認証。

これはかなりです。何か案は?あなたが最初の部分で得られた資格情報は、あなたがそうあなたの身元はおそらく変更と同期呼び出しを行ったアイデンティティにアクセスできないことをあなたが

Access to Identity 'us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' is forbidden 

を取得しているエラーからのようだ

おかげ

+0

このユーザーはどこから来たのですか?あなたはこのタイプのユーザタイプを教えてください –

答えて

1

+0

これについてもっと細かいことはできますか?同様のエラーが発生しています – mm24

関連する問題