私は Apigee を初めて使用するので、理解できていないようです。私は、Web サービス呼び出しを介してデータベースと通信する iOS アプリの実装に精通しています。この呼び出しには、POST、GET などを介して JSON または変数をやり取りすることが含まれます。
私が思い描くユーザー フローは、Facebook の長期トークン ストレージによく似ています。手順は次のとおりです。
- ユーザー名とパスワードを入力してログインします。
- アプリはキーチェーンの access_token を記憶します。
- access_token は、プロファイルの更新など、今後のすべてのリクエストで使用されます。これにより、ユーザーはアプリを使用するたびに再ログインする必要がなくなります。
- ログアウトすると、すべてのトークンがクリアされます。
- トークンが無効または期限切れの場合、アプリはユーザーをログインに戻します。
Apigee に関しては、複数のルートをたどりましたが、それらすべてで行き詰ってしまいました。
ルート 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 オブジェクトが null でないことを確認しました。操作を 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];
このスレッドで説明されている問題のように、「サブジェクトに権限がありません」というメッセージが表示され始めたことを除けば、有望に見えます。Apigee ドキュメントに記載されているように assignPermissions を呼び出してみましたが、問題は解決しませんでした。必要はないはずですが、呼び出しで access_token を提供することさえあります。
login の呼び出しを回避するために、こちらで説明されているstoreOAuth2TokensInKeychain および retrieveStoredOAuth2TokensFromKeychain の呼び出しも試みました。それもうまくいきませんでした。
このエラーを解決する唯一の方法は、updateEntity を呼び出す前に logInUser を呼び出すことです。つまり、ユーザーはアプリを使用するたびにログインする必要があります。キーチェーンにユーザー名/パスワードを保存できることを知っています。しかし、それを行う前に、もっと良い解決策があるかどうか疑問に思っています。
私はそれが長い投稿であることを知っています。それでは、ここまでお読みいただきありがとうございました。どんなポインタでも大歓迎です。