1

RestKit (バージョン 0.10.2) を取得して OAuth2 で認証しようとしています。OAuth インタラクションを処理するためにGTMOAuth2を使用しています。

GTMOAuth2 にサインインして、使用している API にリクエストを送信することに成功しました。また、次のようにして、RestKit にアクセス トークンを使用してリクエストを送信させることもできました。

- (void)setRKAuthorizationToken:(NSString *)authorizationToken {
  RKObjectManager* objectManager = [RKObjectManager sharedManager];
  NSString* authHeader = [NSString stringWithFormat:@"Bearer %@", authorizationToken];
  [objectManager.client setValue:authHeader forHTTPHeaderField:@"Authorization"];
}

このコード サンプルでは、​​HTTP ヘッダーを手動で設定しています。これは、RestKit の OAuth2 のサポートにより、ヘッダーがAuthorization: OAuth2 <accessToken>ではなくとして設定されるためですAuthorization: Bearer <accessToken>

とにかく、アクセス トークンを更新トークンで更新する必要があるまで、これはうまく機能します。

私が本当にやりたいことは、RestKit に を使用するように指示することですGTMOAuth2Authentication- (BOOL)authorizeRequest:(NSMutableURLRequest *)request;これは、アクセス トークンの有効期限が切れたときに、リフレッシュ トークンを使用して新しいアクセス トークンを自動的に取得するためです。

ところで、RestKit はOAuth のサポートを段階的に進めています。サードパーティ ライブラリを使用してリクエストを承認することをお勧めします。私は例を求めましたがdevelopment、その応答は、ブランチにあるクラスからサブクラスへの方向性を示してくれました。

質問は、RestKit 0.10.x を GTMOAuth2 に正常に統合したか、またはこれを達成する方法を知っていますか?

4

2 に答える 2

0

機能するものがあるので、ここで自分の質問に答えますが、理想的ではありません。

基本的に私は手動でリクエストに署名し続けており、期限切れのトークンの可能性に対処するために、GTMOAuth を使用してダミーのリクエストを承認しています。重大な欠点は、API への余分な要求を意味することです。しかし、有効なアクセス トークンを持っていることがわかりました。トリックの一部は、いつ呼び出すかを知ることloginWithBaseController:です。

基本的なコンセプトは次のとおりです。

- (void)makeRequestToEnsureAccessTokenSuccess:(void (^)())block error:(void (^)(NSError*))errorBlock {
  NSURL *url = [NSURL URLWithString:@"https://uri/to/a/basic/api/call.json"];
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

  // TODO: Only do this if we need to. It's kind of a waste to refresh the token
  //  all the time.
  [self.gtmoauth authorizeRequest:request completionHandler:^(NSError *error) {
    if (error) {
      errorBlock(error);
    } else {
      [GTMOAuth2ViewControllerTouch saveParamsToKeychainForName:kKeychainItemName accessibility:NULL authentication:self.gtmoauth];
      block();
    }
  }];
}

- (void)loginWithBaseController:(UIViewController *)baseViewController {
  [self loadAuthFromKeyChain];

  if (self.gtmoauth.canAuthorize) {

    [self makeRequestToEnsureAccessTokenSuccess:^{
      NSLog(@"setting RKAuthorizationToken with %@", self.gtmoauth.accessToken);
      [self setRKAuthorizationToken: self.gtmoauth.accessToken];
      [self.delegate authorizationFinished];
    } error:^(NSError* error) {
      [self logout];
      [self showAuthorizationControllerFor:baseViewController];
    }];
  } else {
    [self showAuthorizationControllerFor:baseViewController];
  }
}

とにかく、私はまだより良い解決策を探しています。少なくとも開発を通じて他の誰かに役立つ場合に備えて、これを投稿すると思いました。

于 2012-11-04T03:36:14.057 に答える