2016-04-05 8 views
0

事前におかげでよろしく!iOSを搭載したAmazon Cognito:アイデンティティへのアクセスが禁止されています

Amazon Cognitoにデータを正しく保存/同期させるのに問題があります。 (Cognitoにデータを格納しない)dataset.synchronize()ラインで

(IDアウト主演で)、私は大きな出力誤差を得るような:

AWSCredentialsProvider.m line:429 | __73-[AWSCognitoCredentialsProvider 
getCredentialsWithCognito:authenticated:]_block_invoke | GetCredentialsForIdentity 
failed. Error is [Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain 
Code=10 "(null)" UserInfo={__type=NotAuthorizedException, message=Access to 
Identity '*****' is forbidden.}] 

cognitoIDはゼロではありません、および適切に返します(と私はオンラインで読むことができる値マッチ)例えば

は、Facebookで認証した後、私は、次の手順を実行します。

if (FBSDKAccessToken.currentAccessToken() != nil) 
    { 
     let fbCognitoToken = FBSDKAccessToken.currentAccessToken().tokenString 
     credentialsProvider.logins = [AWSCognitoLoginProviderKey.Facebook.rawValue: fbCognitoToken] 
     // Retrieve your Amazon Cognito ID 
     credentialsProvider.getIdentityId().continueWithBlock { (task: AWSTask!) -> AnyObject! in 
      if (task.error != nil) { 
       print("Error: " + task.error!.localizedDescription) 
      } 
      else { 
       // the task result will contain the identity id 
       let cognitoId = task.result 

       //checking if cognito was successful, if true, sets success condition to true to prepare for segue into app 
       if cognitoId != nil{ 
        print (cognitoId) 
        cognitoSuccess = true 

        let syncClient = AWSCognito.defaultCognito() 

        let dataset = syncClient.openOrCreateDataset("User_Data") 
        dataset.setString("[email protected]", forKey:"Email") 
       // credentialsProvider.refresh() 
        dataset.synchronize() 
        } }return nil}} 

私は顔からデータを読み取ることができます私が知ることからすべての認証が正しく行われました。私はここに根源的な何かがあると思っていますが、数日を過ごした後、私はそれを理解できません! AWSポータルのIAMチェッカーを使用すると、Cognito関数のすべての「緑色のチェック」が返されるため、サーバーサイドの権限の問題ではないと確信しています。

ありがとうございました。

編集: 上記のコードの塊の前に、私は呼ん:

let credentialsProvider = self.initializeCognito() 

(アイデンティティ・プールのIDが出て主演)実行される:

あなたがいるときに例外がスローされる可能性が
func initializeCognito() -> AWSCognitoCredentialsProvider 
{ 
    let credentialsProvider = AWSCognitoCredentialsProvider(
     regionType: AWSRegionType.USEast1, identityPoolId: "******") 

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

    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration 

    return credentialsProvider  
} 

答えて

0

私がAWSを最初に設定し、Amazonのガイドのいくつかに従っていたときに、アプリケーションのApp Delegateに新しいcredentialsProviderを作成するコードを配置しました。私はそれを忘れて、後で別のcredentialsProviderを初期化しようとしていました。この混乱によって問題が発生し、App Delegateの初期化を削除すると認証の問題が修正されました。

0

認証されたIDのクレデンシャルを、それにリンクされたプロバイダトークンを与えずに取得しようとしています。 Cognitoは、少なくとも1つを与える必要があります。

失敗したGetCredentialsForIdentityコール中にFacebookブックトークンを含めていることを確認できますか?もしそうでなければ、私はそれがあなたの問題だと思います。

編集:

あなたがAWSCognito.defaultCognitoを()を使用しているので、それは同期クライアントは、右の資格情報プロバイダを使用することを確認するthis docs page上の例に従うことを助けるかもしれない:

終わった
let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider) 

AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration 
+0

ありがとうございました!上記の4行目のコードでは、FacebookのトークンをCognitoの資格情報プロバイダに渡します。これは不十分ですか?もし私が尋ねることができたら、私は何を書いておくべきですか?ありがとう! – kmypwn

+0

これは少しずつ異なります。ログインしようとすると直ちに失敗しますか?または、アプリケーションを閉じて少し待っていますか?前者の場合、この資格プロバイダで同期クライアントを初期化していますか? –

+0

Facebookへのログイン後(成功)、このコードはすぐに呼び出されます。 cognitoIDが「正しく」返されます。つまり、print(cognitoID)を使用して無意味なものが得られない場合は、一意の識別子(AWS Cognito Identity Browserが見つかるものと同じ)が正しく印刷されます。私はcredentialsProviderをコメントアウトしました。refresh()行を追加するだけですが、.synchronise()行にすでに用意されているような別のエラーが返されます。要するに、いいえ、近い/再開はありません! – kmypwn

関連する問題