0

私は Apigee を初めて使用するので、理解できていないようです。私は、Web サービス呼び出しを介してデータベースと通信する iOS アプリの実装に精通しています。この呼び出しには、POST、GET などを介して JSON または変数をやり取りすることが含まれます。

私が思い描くユーザー フローは、Facebook の長期トークン ストレージによく似ています。手順は次のとおりです。

  1. ユーザー名とパスワードを入力してログインします。
  2. アプリはキーチェーンの access_token を記憶します。
  3. access_token は、プロファイルの更新など、今後のすべてのリクエストで使用されます。これにより、ユーザーはアプリを使用するたびに再ログインする必要がなくなります。
  4. ログアウトすると、すべてのトークンがクリアされます。
  5. トークンが無効または期限切れの場合、アプリはユーザーをログインに戻します。

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 を呼び出すことです。つまり、ユーザーはアプリを使用するたびにログインする必要があります。キーチェーンにユーザー名/パスワードを保存できることを知っています。しかし、それを行う前に、もっと良い解決策があるかどうか疑問に思っています。

私はそれが長い投稿であることを知っています。それでは、ここまでお読みいただきありがとうございました。どんなポインタでも大歓迎です。

4

0 に答える 0