1

我正在尝试让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's - (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 回答
0

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

The referenced sample iOS application at telegraphy-interactive/OAuthClientSetup has a pluggable architecture for authorized operations. It includes a class, OACSAuthOpRK that provides a RestKit RKObjectManager operation for making an authorized request.

The strategy used there is to wrap the request inside of the authorization. The authorization checks the currency of the OAuth2 authorization token. Finding the token current, it tries the request and checks the return status. Finding the token expired, or finding a 401 status return from the request, it will refresh the authorization token and try the request one more time.

于 2014-03-28T08:46:38.507 回答