如何在iOS上将GTMOAuth2与RestKit集成?

时间:2012-11-02 22:49:32

标签: iphone objective-c ios oauth-2.0 restkit

我正在尝试获取RestKit(版本0.10.2)以使用OAuth2进行身份验证。我正在使用GTMOAuth2来处理OAuth交互。

我已成功获得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的{​​{1}},因为它会在访问令牌到期时自动使用刷新令牌获取新的访问令牌。

BTW,RestKit是phasing it's support for OAuth;建议的方法是使用第三方库授权请求。我asked for an example并且响应指向了子类的方向,它位于- (BOOL)authorizeRequest:(NSMutableURLRequest *)request;分支中。

所以,问题是:您是否已成功将RestKit 0.10.x与GTMOAuth2集成或知道如何实现此目的?

2 个答案:

答案 0 :(得分: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];
  }
}

无论如何,我仍然在寻找更好的解决方案。我想我会发布这个,以防它至少通过开发帮助别人。

答案 1 :(得分:0)

RestKit Wiki上的这篇文章OAuth Support on Restkit引用了使用AFOAuth2Client的完整解决方案。

telegraphy-interactive/OAuthClientSetup处引用的示例iOS应用程序具有可授权操作的可插入架构。它包含一个类OACSAuthOpRK,它提供RestKit RKObjectManager操作来发出授权请求。

其中使用的策略是将请求包装在授权内。授权检查OAuth2授权令牌的货币。查找令牌当前,它会尝试请求并检查返回状态。查找令牌已过期,或从请求中查找401状态返回,它将刷新授权令牌并再次尝试请求。