Ненадежность AWS API Gateway при обновлении

Я довольно долго использовал API-шлюз и лишь немного изменил API, чтобы разрешить другую функцию. Я вошел в шлюз API и проверил функцию, чтобы убедиться, что она работает. Затем я попробовал это на своем iPhone, и это тоже сработало. Случайным образом позже я начал получать повторяющиеся экземпляры {errorMessage: "Время ожидания задачи истекло через 3,00 секунды"}. Я не понимаю, почему простой метод входа в систему (метод в API Gateway) никогда не истекает, тем более что я тестировал ввод как на iPhone (когда он ранее работал), так и непосредственно с помощью консоли API Gateway.

Комментарий. Я не использую сгенерированный SDK или AWSAPIGatewayClient. Я просто делаю http-запрос.

http-запрос на вход

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSMutableDictionary *post = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                      [defaults objectForKey:@"username"], @"username",
                      [defaults objectForKey:@"password"], @"password",
                      nil];
NSError *error;
NSData *postData = [NSJSONSerialization dataWithJSONObject:post options:0 error:&error];
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"someLoginEndpoint"]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSDictionary *newJSON = [NSJSONSerialization JSONObjectWithData:data
                                                            options:0
                                                              error:&error];
    if(!newJSON || [newJSON objectForKey:@"errorMessage"]){
        NSLog(@"%@",newJSON);
        callBack(false);
        NSLog(@"DID NOT AUTHENTICATE");
    }else{
        NSLog(@"%@",newJSON);
        [defaults setValue:[newJSON objectForKey:@"Token"] forKey:@"Token"];
        [defaults setValue:[newJSON objectForKey:@"IdentityId"] forKey:@"IdentityId"];
        [self authenticateUser:^(BOOL call){
            callBack(call);
        }];
    }
}] resume];

Метод обновления

- (AWSTask *)refresh {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![self authenticatedWithProvider]) {
    return [super getIdentityId];
}else{
    NSDictionary *post = [[NSDictionary alloc] initWithObjectsAndKeys:
                          [defaults objectForKey:@"username"], @"username",
                          [defaults objectForKey:@"password"], @"password",
                          nil];
    NSError *error;
    NSData *postData = [NSJSONSerialization dataWithJSONObject:post options:0 error:&error];
    NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:@"someLoginEndpoint"]];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody:postData];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    __block BOOL isLogged = false;

    [[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSDictionary *newJSON = [NSJSONSerialization JSONObjectWithData:data
                                                                options:0
                                                                  error:&error];
        isLogged = true;
        if(!newJSON){
            NSLog(@"DID NOT AUTHENTICATE");
        }else{
            NSLog(@"The IdentityID in the refresh method: %@",[newJSON objectForKey:@"IdentityId" ]);
            NSLog(@"The token in the refresh method: %@",[newJSON objectForKey:@"Token" ]);
        self.identityId = [newJSON objectForKey:@"IdentityId" ];
        self.token = [newJSON objectForKey:@"Token" ];
        }

    }] resume];

    return [super getIdentityId];

}
return [super getIdentityId];
}

аутентифицировать пользователя

 //BusytimeAuthenticated
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
id<AWSCognitoIdentityProvider> identityProvider = [[BusytimeAuthenticated alloc] initWithRegionType:AWSRegionUSEast1
                                                                                         identityId:nil
                                                                                     identityPoolId:@"somePoolID"
                                                                            logins:@{@"cognito-identity.amazonaws.com": [defaults objectForKey:@"Token"]}
                                                                                       providerName:@"cognito-identity.amazonaws.com"
                                                   ];

credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1
                                                               identityProvider:identityProvider
                                                                  unauthRoleArn:nil
                                                                    authRoleArn:nil];
configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1
                                            credentialsProvider:self.credentialsProvider];
AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;
[[credentialsProvider refresh] continueWithBlock:^id(AWSTask *task){
    callBack(true);
    return nil;
}];

}

ошибка Невозможно обновить. Ошибка: [Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=10 "(null)" UserInfo={message=Неверный токен для входа. Невозможно передать токен Cognito., __type=NotAuthorizedException}]

Мой основной вопрос: почему эта операция такая ненадежная? Иногда он работает для входа в систему моего пользователя, а затем, когда я использую метод обновления, я передаю те же учетные данные, но параллельный запрос приводит к сбою второго запроса.


person user2977578    schedule 24.11.2015    source источник
comment
Вы используете интеграцию Lambda? Холодный запуск Lambda может привести к истечению времени ожидания вызова шлюза API. Возможно, вам потребуется оптимизировать Lambda, чтобы избежать тайм-аутов. Кроме того, вы включили только свой метод обновления. Ошибка Cognito, по-видимому, указывает на проблему, связанную с тем, как вы закодировали своего поставщика удостоверений. Вы можете обновить свой вопрос с полной реализацией поставщика удостоверений.   -  person Bob Kinney    schedule 28.11.2015
comment
дайте мне секунду, я обновлю свой вопрос. Но да, я использую лямбда-интеграцию, я посмотрю на ее оптимизацию.   -  person user2977578    schedule 28.11.2015


Ответы (1)


Относительно тайм-аутов:

Как упоминалось в комментариях, холодный запуск Lambda может привести к истечению времени ожидания вызова шлюза API, вам может потребоваться оптимизировать Lambda, чтобы избежать тайм-аутов.

Относительно ошибки обновления:

Вы используете cognito-identity.amazonaws.com в карте входа в систему, но используете шаблон IdentityProvider для обновления. Вот почему первая аутентификация проходит успешно, но попытки обновления завершаются неудачно. Логика вашего обновления никогда не сработает.

Я предлагаю вам ознакомиться с нашим сквозной пример предлагаемого процесса обработки удостоверений, прошедших проверку подлинности разработчика.

Если вы хотите продолжать использовать cognito-identity.amazonaws.com в карте входа в систему, то обновление вашего токена фактически должно выполняться вне поставщика удостоверений/учетных данных. , подобно тому, как вы бы обращались с токенами Facebook.

person Bob Kinney    schedule 28.11.2015
comment
как мне оптимизировать мой лямбда-метод? Должен ли я просто увеличить время ожидания или есть что-то конкретное для улучшения времени холодного запуска? - person user2977578; 28.11.2015
comment
Мне было интересно, могу ли я получить некоторые разъяснения относительно части ошибки обновления. Я совершенно не понимаю, как, по-твоему, мне следует к этому подходить. Пример приложения становится действительно запутанным, поскольку он не комментирует то, что делает, как другие части в методе обновления. - person user2977578; 02.12.2015
comment
Кроме того, некоторое время назад у меня было переполнение стека, и я столкнулся с несколькими проблемами с аутентификацией разработчика, и мне сказали переключиться с MyProviderName на cognito-identity.amazonaws.com. - person user2977578; 02.12.2015
comment
это вопрос, в котором мне рекомендовали переключиться с MyProviderName: stackoverflow.com/questions/33228309/ - person user2977578; 02.12.2015
comment
Использование cognito-identity.amazonaws.com работает, если вы не используете шаблон AWSCognitoIdentityProvider. Вы можете просмотреть это сообщение на форуме. надеюсь, проясните предполагаемый поток с помощью этого шаблона. - person Bob Kinney; 02.12.2015