0

У меня есть пул пользователей Cognito для регистрации/моих пользователей из приложения, а затем использования идентификатора Cognito для обеспечения аутентификации. Я отключил пользователей, не прошедших проверку подлинности. Как только пользователь зарегистрируется, пользователь создается в пуле. Когда он регистрируется, личность создается в пуле идентификаторов, и я вижу, что это удостоверение связано с пулом пользователей (связанный логин). Однако, когда пользователь попытался получить доступ к ресурсам AWS (Dynamo, функция Lambda и т. Д.), Вызов возвращает «Недопустимый доступ для этого пула идентификаторов не поддерживается». Однако я могу получить информацию о пользователе и идентификатор идентификатора, который создан в пуле идентификаторов.Доступ к неавторизованному доступу не поддерживается для этого пула идентификаторов с пулом пользователей

Это код, я использую:

func cognitoUserPoolInit(window:UIWindow, debugLogFiles: DebugLogFiles) { 
    self.window = window 

    //Configure Cognito Identity User Pool. Edit ConstantAWS to change pool 
    let serviceConfiguration = AWSServiceConfiguration(region: K.COGNITO_REGIONTYPE, credentialsProvider: nil) 
    let userPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: K.COGNITO_USER_POOL_APP_CLIENT_ID, clientSecret: K.COGNITO_USER_POOL_APP_CLIENT_SECRET, poolId: K.COGNITO_USER_POOL_ID) 

    AWSCognitoIdentityUserPool.registerCognitoIdentityUserPoolWithConfiguration(serviceConfiguration, userPoolConfiguration: userPoolConfiguration, forKey: "UserPool") 

    self.pool = AWSCognitoIdentityUserPool(forKey: "UserPool") 
    self.pool!.delegate = self 
    self.cognitoIdentityUser = self.pool!.currentUser() 
} 

func getCognitoUserPoolUserId() { 
      self.cognitoIdentityUser!.getDetails().continueWithBlock() { (task) in 
       dispatch_async(dispatch_get_main_queue()) { 
        self.needtoGetCognitoUserId = false 
        if task.error != nil { // some sort of error 
         let alert = UIAlertController(title: "", message: task.error?.userInfo["message"] as? String, preferredStyle: UIAlertControllerStyle.Alert) 
         alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil)) 

         NSLog("Domain: " + (task.error?.domain)! + " Code: \(task.error?.code)") 

         if task.error?.code == NSURLErrorNotConnectedToInternet { 
          self.lastError = (task.error?.code)! 
          //no internet connection. Fire a timer to get our credential as soon as network is back 
          let internetOfflineTimer:NSTimer = NSTimer.scheduledTimerWithTimeInterval(10.0, target: self, selector: #selector(UserPool.internetOffline), userInfo: nil, repeats: false) 
          dispatch_async(dispatch_get_main_queue(), {() -> Void in 
           NSRunLoop.mainRunLoop().addTimer(internetOfflineTimer, forMode: NSDefaultRunLoopMode) 
          }) 
         } else { 
          if task.error?.userInfo["message"] != nil { 
           NSLog(task.error?.userInfo["message"] as! String) 

          } 
         } 
        } else { 
         // I got no error 
         // i got the username earlier - use it 
         self.lastError = 0 
         if let response: AWSCognitoIdentityUserGetDetailsResponse = task.result as? AWSCognitoIdentityUserGetDetailsResponse { 
          var sub: String? 
          for attribute in response.userAttributes! { 
           if attribute.name == "sub" { 
            sub = attribute.value 
            NSLog("sub:" + sub!) 
            break; 
           } 

          } 
          //if the user Id, then go ahead and get the dynamoDB table 
          if sub != nil { 
           self.cognitoUserPoolUserId = sub 
           self.getCognitoIdentity() 
          } else { 
           NSLog("UserId not found in response") 
          } 
         } 
        } 
       } 


       return nil 
      } 

     } 


    func getCognitoIdentity() -> Bool { 
    // Initialize the Amazon Cognito credentials provider 

    //get pool id from plist (Federated Identieis pool not User pool) 
    var myDict: NSDictionary? 
    var identityPoolID: String? 
    var region: String? 
    //PoolId points to TestIDPool in the Federated Identitied/West region for test purpose 
    if let path = NSBundle.mainBundle().pathForResource("Info", ofType: "plist") { 
     myDict = NSDictionary(contentsOfFile: path) 
     identityPoolID = myDict!.objectForKey("AWS")!.objectForKey("CredentialsProvider")!.objectForKey("CognitoIdentity")!.objectForKey("Default")!.objectForKey("PoolId")! as? String; 
     region = myDict!.objectForKey("AWS")!.objectForKey("CredentialsProvider")!.objectForKey("CognitoIdentity")!.objectForKey("Default")!.objectForKey("Region") as? String; 
    } else { 
     return false 
    } 

    self.credentialsProvider = AWSCognitoCredentialsProvider(regionType: region!.aws_regionTypeValue(), identityPoolId: identityPoolID!, identityProviderManager:self.pool) 
    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = AWSServiceConfiguration(region: .USWest2, credentialsProvider: self.credentialsProvider) 

    transferManager = AWSS3TransferManager.defaultS3TransferManager() 


    // Retrieve your Amazon Cognito ID 
    self.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 
      print("cognitoId: " + self.credentialsProvider!.identityId!) 
      //At this point we get the identity to query the database 
      self.queryLatestItem() 
     } 
     return nil 
    } 
    return true 
} 


func queryLatestItem() { 
     let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper() 

     let queryExpression = AWSDynamoDBQueryExpression() 
    queryExpression.scanIndexForward = false 
    queryExpression.limit = 1 
    queryExpression.keyConditionExpression = "userId = :UID" 
    queryExpression.expressionAttributeValues = [":UID" : (self.cognitoUserPoolUserId)!] 

    dynamoDBObjectMapper .query(StatisticsDB.self, expression: queryExpression) .continueWithExecutor(AWSExecutor.mainThreadExecutor(), withBlock: { (task:AWSTask!) -> AnyObject! in 
     if (task.error != nil) { 
      print("Error: \(task.error)") --> this is where i get the unauthenticated error..... 
... 

cognitoUserPoolInit() вызывается из AppDelegate и getCognitoUserPoolUserId(), когда пользователь получить к пользовательскому интерфейсу, требующих данных DynamoDB.

Если я выбираю «Включить доступ к неаутентифицированным удостоверениям» в объединенном пуле, он отлично работает.

Кроме того, у меня есть веб-приложение и вы можете войти в систему, пройти аутентификацию и получить доступ к службам AWS без каких-либо проблем. Мне тоже, моя конфигурация AWS/ролей должна быть хорошей и, вероятно, что-то не так происходит на стороне приложения.

Я не понимаю, как получить информацию о пользователе и исправить идентификатор личности (от print("cognitoId: " + self.credentialsProvider!.identityId!)) и получить ошибку, не прошедшую проверку.

Перезапуск снова приложение дает несколько иную ошибку:

{ 
    Connection = "keep-alive"; 
    "Content-Length" = 129; 
    "Content-Type" = "application/x-amz-json-1.1"; 
    Date = "Sun, 29 Jan 2017 20:04:06 GMT"; 
    "x-amzn-ErrorMessage" = "Access to Identity 'us-west-2:714eccXXXa5-42d8-8b29-5e2XXXXXXX' is forbidden."; 
    "x-amzn-ErrorType" = "NotAuthorizedException:"; 
    "x-amzn-RequestId" = "16fc81c2-e65e-11e6-9643-756bf858abb7"; 
} 

Добавлена ​​роль разрешений для AUTH я использую:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "mobileanalytics:PutEvents", 
       "cognito-sync:*", 
       "cognito-identity:*", 
       "dynamodb:*", 
       "lambda:*", 
       "s3:*" 
      ], 
      "Resource": [ 
       "*" 
      ] 
     } 
    ] 
} 

и доверительные отношения

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Sid": "", 
     "Effect": "Allow", 
     "Principal": { 
     "Federated": "cognito-identity.amazonaws.com" 
     }, 
     "Action": "sts:AssumeRoleWithWebIdentity", 
     "Condition": { 
     "StringEquals": { 
      "cognito-identity.amazonaws.com:aud": "us-west-2:7cXXXX5f-b91e-4fc9-a72c-6f91XXXXXXX" 
     }, 
     "ForAnyValue:StringLike": { 
      "cognito-identity.amazonaws.com:amr": "authenticated" 
     } 
     } 
    } 
    ] 
} 
+0

Похоже, вы получаете эту ошибку при попытке запросить DynamoDB Таблица. Мой первый инстинкт заключается в том, что у вас нет роли auth_user в настройке AWS IAM, чтобы разрешить Query. – Pierce

+0

Я должен расширить то, что я пытаюсь сказать - я думаю, что ваша роль IAM для вашей конкретной таблицы DynamoDB не позволяет Query для auth_user. Можете ли вы проверить это и сообщить мне? – Pierce

+0

Я добавил разрешения и доверительные отношения, которые я использую для Auth_role моего пула идентификаторов. Пока, когда я использую шаблон для всех служб AWS, которые мне нужны, необходимо включить запрос DynamoDB. – Fredo

ответ

2

Я смог найти первопричину. Следующая строка будет повторно инициализировать конфигурации службы ранее установленные:

let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper() 

Так я заменил эту предыдущую строку с:

let objectMapperConfiguration = AWSDynamoDBObjectMapperConfiguration()   
serviceConfig = AWSServiceConfiguration(region: .USWest2, credentialsProvider: self.credentialsProvider) 
AWSDynamoDBObjectMapper.registerDynamoDBObjectMapperWithConfiguration(serviceConfig!, objectMapperConfiguration: objectMapperConfiguration, forKey: "USWest2DynamoDBObjectMapper") 

let dynamoDBObjectMapper = AWSDynamoDBObjectMapper(forKey: "USWest2DynamoDBObjectMapper") 
0

См «Настройка AWS Учетные данные в ваших файлах с использованием Amazon Cognito "http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.Js.Summary.html В этом примере они создают не прошедшую проверку роль для этого типа доступа. Надеюсь, это поможет вам.

+0

Спасибо за ссылку! Тем не менее, неаутентифицированный доступ работает для меня как для моего приложения iOS, так и для веб-приложения (Javascript). Теперь я хочу перейти только к аутентифицированному доступу. – Fredo

Смежные вопросы