Проверка подлинности пользователя Apigee, access_token и сеанс входа в кэш в iOS
Я новичок в Apigee и не могу обернуть голову вокруг этого. Я знаком с реализацией приложения для iOS, которое общается с базой данных через вызов веб-службы. Вызов будет включать передачу туда и обратно JSON или переменных через POST, GET и т. Д.
Поток пользователей, который я представляю, во многом похож на долгосрочное хранение токенов Facebook. Вот шаги:
- Введите имя пользователя и пароль для входа.
- Приложение запомнит access_token в цепочке для ключей.
- Access_token будет использоваться с любыми будущими запросами, такими как обновление профиля. Таким образом, пользователь не должен повторно входить в систему каждый раз, когда он / она использует приложение.
- Выйти очистит все токены.
- Если токен недействителен или срок его действия истек, приложение вернет пользователя для входа в систему.
Я взял несколько маршрутов и в итоге застрял на всех, когда дело доходит до Апиджи.
МАРШРУТ 1
Я позвонил в logInUser и получил взамен access_token.
[self.apigeeDataClient logInUser:username password:password];
Все это хорошо, пока я не хочу обновить адрес электронной почты пользователя, используя код ниже.
NSMutableDictionary *requestDict = [NSMutableDictionary dictionary];
[requestDict setObject:email forKey:kDataEmail];
NSString *url = [NSString stringWithFormat:@"%@/%@/%@/users/%@?access_token=%@", BASE_URL, UG_ORG_NAME, APP_NAME, [userData objectForKey:kDataUUID], self.accessToken];
NSString *op = @"PUT";
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[NSDictionary dictionaryWithDictionary:requestDict]
options:0
error:&error];
[self.apigeeDataClient apiRequest:url operation:op data:[NSString stringWithUTF8String:[jsonData bytes]]];
Кажется, что каждый раз, когда выдает сообщение об ошибке "Нет содержимого для сопоставления с объектом из-за конца ввода". Я проверил эту тему, но не повезло. Я убедился, что объект JSON не является нулевым. Я попытался изменить операцию с PUT на POST и GET. Ни один из которых не обновляет адрес электронной почты в базе данных.
МАРШРУТ 2
Вместо того, чтобы использовать apiRequest, я переключился на updateEntity.
NSMutableDictionary *requestDict = [NSMutableDictionary dictionary];
[requestDict setObject:email forKey:kDataEmail];
[requestDict setObject:kDataUsers forKey:kDataType];
[requestDict setObject:self.accessToken forKey:kDataAccessToken];
NSString *entityID = [userData objectForKey:kDataUUID];
[self.apigeeDataClient updateEntity:entityID entity:requestDict];
Это выглядит многообещающе, за исключением того, что я начал получать "У субъекта нет разрешения", как проблема, описанная в этой теме. Я попытался вызвать assignPermissions, как указано в документе Apigee, но это не решило проблему. Я даже предоставляю access_token с вызовом, хотя мне это и не нужно.
В попытке избежать вызова входа в систему также пытались вызвать storeOAuth2TokensInKeychain и retrieveStoredOAuth2TokensFromKeychain, упомянутые здесь. Это тоже не сработало.
Единственный способ устранить эту ошибку - вызвать logInUser перед вызовом updateEntity. Это означает, что пользователь должен будет входить в систему каждый раз, когда он / она хочет использовать приложение. Я знаю, что могу хранить имя пользователя / пароль в связке ключей. Но прежде чем я это сделаю, мне интересно, есть ли лучшее решение там.
Я знаю, что это длинный пост. Так что спасибо, что прочитали это далеко. Любые указатели очень ценятся.